本文共 877 字,大约阅读时间需要 2 分钟。
今天遇到一个c++构造函数的奇怪问题。
ClassA{public: /* default construction */ ClassA(){} /* construction */ ClassA(const char *str){}}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();
以上问题在(GCC) 4.8.2 20140120 (Red Hat 4.8.2-16) 出现。
目前还不是很理解这个问题的原因。以后明白了贴上来。我猜可能是以下几个原因:
符号优先级。
临时对象的问题。//20150206补
后面反思了一下,
const char *p = "sharedsecrete";ClassB b( ClassA(p) );这天语句可能被编译器理解成将p强制转换成classA,然后调用ClassB的构造函数。
转载地址:http://ziopi.baihongyu.com/