使用指向常量 c 字符串的指针在构造函数上编译错误
Compile error on constructor using pointer to constant c-string
有人可以解释为什么我可以编译 运行 这个
T t1( T2( "TEST") );
t1.print();
但不是这个
const char * TEST_STRING = "TEST";
T t1( T2( TEST_STRING ) );
t1.print();
第二块显示
error: request for member ‘print’ in ‘t1’, which is of non-class type ‘T(T2)’
类如下
class T2 {
public:
T2( const char * str ) {
m_str = str;
}
void test() const {
cout << "t2 test" << m_str << endl;
}
private:
const char * m_str;
};
class T {
public:
T( const T2 & t2 ) {
t2.test();
}
void print() {
cout << "t print " << endl;
}
};
我的 g++ 版本是
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
谢谢
感谢 immibis, Richard Critten, aschepler and wiki
的所有评论
问题是因为
T t1( T2( TEST_STRING ) );
可以解释为
- 函数名 t1 的函数声明以 T2 作为参数,return T
- class T 的 t1 的变量定义,用 class T2 的匿名实例初始化。
并被解释为函数声明。
两个可能的干净修复,来自 aschepler
Another workaround: T t1( static_cast<T2>( TEST_STRING ) );
Or just: T t1(( T2(TEST_STRING) ));
(Extra parentheses are allowed
around a declarator, but not around a full function parameter, so that
can't possibly mean a function declaration.)
有人可以解释为什么我可以编译 运行 这个
T t1( T2( "TEST") );
t1.print();
但不是这个
const char * TEST_STRING = "TEST";
T t1( T2( TEST_STRING ) );
t1.print();
第二块显示
error: request for member ‘print’ in ‘t1’, which is of non-class type ‘T(T2)’
类如下
class T2 {
public:
T2( const char * str ) {
m_str = str;
}
void test() const {
cout << "t2 test" << m_str << endl;
}
private:
const char * m_str;
};
class T {
public:
T( const T2 & t2 ) {
t2.test();
}
void print() {
cout << "t print " << endl;
}
};
我的 g++ 版本是
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
谢谢
感谢 immibis, Richard Critten, aschepler and wiki
的所有评论问题是因为
T t1( T2( TEST_STRING ) );
可以解释为
- 函数名 t1 的函数声明以 T2 作为参数,return T
- class T 的 t1 的变量定义,用 class T2 的匿名实例初始化。
并被解释为函数声明。
两个可能的干净修复,来自 aschepler
Another workaround:
T t1( static_cast<T2>( TEST_STRING ) );
Or just:
T t1(( T2(TEST_STRING) ));
(Extra parentheses are allowed around a declarator, but not around a full function parameter, so that can't possibly mean a function declaration.)