struct B {
int b;
B(int i = 0) : b(i) {}; // constructor
};
struct D : B {
int d;
};
int main () {
D obj = {1}; // <-- error
// D obj {1}; // <-- error (different)
}
Выше код не компилируется, а дает:
error: could not convert ‘{1}’ from ‘<brace-enclosed initializer list>’ to ‘D’
То же самое верно, даже если я удалю строку «конструктор».
Если я удалю =
знак, т.е. D obj {1};
тогда это дает ниже:
error: no matching function for call to ‘D::D(<brace-enclosed initializer list>)’
Какой правильный синтаксис для устранения такой проблемы?
D
не имеет конструктор, принимающий int
, Если вы хотите, чтобы он унаследовал B
конструктор, скажем так, вот так:
struct D : B {
using B::B;
int d;
};
Вы, вероятно, хотите сделать больше, хотя, учитывая, что D
имеет другой int
член.
Более полный D
который инициализирует оба B::b
(позвонив по B::B
) а также D::d
будет выглядеть примерно так:
struct D : B {
D(int d_) : B(d_), d(d_) {}
int d;
};
В любом случае, ваш код должен сказать D
имеет конструктор, принимающий int
,
Ссылка на рабочий пример с использованием вашего кода и моего фрагмента: http://goo.gl/YbSSHn
В том, что вы написали D
имеет только конструктор по умолчанию и не знает, как вызвать B::B(int i)
, Все, что вам нужно сделать, это предоставить соответствующий конструктор в D
лайк:
struct D : B {
D(int i) : B(i) {}//;
int d;
};