【发布时间】:2013-08-31 00:26:52
【问题描述】:
我很难在谷歌上找到这方面的点击率。
struct a {
float m_x;
float m_z;
public:
a(float x): m_x(x) {}
};
class b : public a {
b(float z): m_z(z) {}
};
在铿锵 3.2 上:
error: member initializer 'm_z' does not name a non-static data member or base class
b(float z): m_z(z) {}
【问题讨论】:
-
为什么?我还没有做出“邪恶传承钻石”。 @AndreyT 该问题中接受的答案说要制作一个基本的ctor。我有一个……哦。我想我需要调用基类ctor,而不是成员ctor。好的。
-
@WhozCraig:即使它是一个虚拟基地,它仍然不会让你初始化间接成员。虚拟继承可能需要初始化间接基,而不是成员。
-
@Steven Lu:接受的答案是
a::m_z只能从a的构造函数初始化列表中初始化。它不能在b的构造函数初始化列表中提及(如您的代码中所示)。语言不允许这样做。这才是重点。 IE。您必须向a的构造函数添加另一个参数,专门针对m_z(就像您为m_x所做的那样)并通过该构造函数从b传递初始值。顺便说一句,在您上面的代码中,您必须从b的构造函数中引用a的构造函数。否则,它将无法编译,因为您在a中没有默认构造函数。 -
知道了,谢谢。关闭这个问题很好,但我认为它应该保持可搜索状态,以便出现此错误的用户可以快速找到解决方案。
-
@AndreyT 说得对,先生,我暂时被剥夺睡眠和同时送来的比萨饼分心。嗯。删除评论。