在编译下面的代码时,出现错误。
class shared {
public:
shared() {
cout<<"class shared \n";
}
};
class test1 {
public:
test1(shared obj){
cout<<"class test1 \n";
}
};
class test2 {
private:
shared s_obj;
test1 test1_obj(s_obj); // Error statement
};
int main()
{
test2 b_obj;
return 0;
}
ERROR : error: ‘s_obj’ is not a type
test1 test1_obj(s_obj);
答案 0 :(得分:4)
您不能像这样初始化您的成员,您应该使用成员初始化列表:
class test2
{
test2() : test1_obj(s_obj) {}
private:
shared s_obj;
test1 test1_obj;
};
或者您可以按照评论中的说明使用统一初始化:
test1 test1_obj{s_obj};
答案 1 :(得分:2)
此:
test1 test1_obj(s_obj);
原则上X Y(Z)
可以解释为
Y
的变量X
,并使用值Z
初始化,或者Y
,返回类型X
,并接受类型为Z
的单个参数。您想要#1,但是解释#2实际上是强制性的。
也就是说,您要声明一个用test1
初始化的s_obj
对象,但这实际上是声明了一个名为test1_obj
的函数,该函数返回test1
并接受一个类型为s_obj
的参数(由于错误状态,不存在这种类型)。
这是使用统一初始化的原因之一:
test1 test1_obj{s_obj};
并不是模棱两可的,因为它不会被误认为一个函数。