C ++ 11 Унифицированная инициализация (то есть инициализация списка) не компилируется с наследованием

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>)’

Какой правильный синтаксис для устранения такой проблемы?

-1

Решение

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

7

Другие решения

В том, что вы написали D имеет только конструктор по умолчанию и не знает, как вызвать B::B(int i), Все, что вам нужно сделать, это предоставить соответствующий конструктор в D лайк:

struct D : B  {
D(int i) : B(i) {}//;
int d;
};
1

По вопросам рекламы [email protected]