我很難在google上查找匹配。成員初始值設定程序未指定非靜態數據成員或基類
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) {}
爲什麼?我還沒有製造出「邪惡的繼承鑽石」。 @Andrey在這個問題上接受的答案說要做出一個基本的決定。我有一個......哦。我想我需要調用基類ctor,而不是成員ctor。好。 –
@WhozCraig:即使它是一個虛擬基礎,它仍然不會讓你初始化*間接*成員。虛擬繼承可能需要初始化間接*基礎*,但不是成員。 – AnT
@Steven Lu:接受的答案是'a :: m_z'只能從'a'的構造函數初始化列表中初始化。它不能在'b'的構造函數初始值設定項列表中提及(就像在你的代碼中一樣)。該語言不允許。這纔是重點。即你必須爲'm_z'特別添加另外一個參數到'a'的構造函數中(就像你爲'm_x'所做的那樣),並通過該構造函數從'b'傳遞初始值。順便說一句,在你的代碼中,你必須從'b'的構造函數中引用'a'的構造函數。否則,它不會編譯,因爲'a'中沒有默認的構造函數。 – AnT