今天遇到一个c++构造函数的奇怪问题。
ClassA{
public:
/* default construction */
ClassA(){}</span>
/* construction */
ClassA(const char *str){}</span>
}
ClassB{
public:
/* default construction */
ClassB(){}
/* construction */
ClassB(ClassA clsA){}
XXX(){}
}
/* test code */
/* 这是正常的 */
ClassB b(ClassA("sharedsecrete"));
/* 这是不正常的
request for member ‘XXX’ in ‘b’, which is of non-class type*/
const char *p = "sharedsecrete";
ClassB b( ClassA(p) );
b.XXX();
/* 以下几种方式又没问题 */
const char *p = "sharedsecrete";
ClassB b( ClassA((const char *)p) );
b.XXX();
const char *p = "sharedsecrete";
ClassB b( (ClassA(p) ) );
b.XXX();
const char *p = "sharedsecrete";
ClassA a(p);
ClassB b(a);
b.XXX();
</pre><pre>
以上问题在(GCC) 4.8.2 20140120 (Red Hat 4.8.2-16) 出现。
目前还不是很理解这个问题的原因。以后明白了贴上来。我猜可能是以下几个原因:
符号优先级。
临时对象的问题。//20150206补
后面反思了一下,
const char *p = "sharedsecrete";
ClassB b( ClassA(p) );
这天语句可能被编译器理解成将p强制转换成classA,然后调用ClassB的构造函数。