C ++ 11统一初始化(即列表初始化)不使用继承进行编译

时间:2014-07-21 10:33:42

标签: c++ inheritance c++11 compiler-errors list-initialization

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’

同样如此,即使我删除了&#34;构造函数&#34;线。 如果我删除=符号,即D obj {1};,则会在下面给出:

error: no matching function for call to ‘D::D(<brace-enclosed initializer list>)’

解决此类问题的正确语法是什么?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

在您编写的内容中,D只有一个默认构造函数,并且不知道如何调用B::B(int i)。您所要做的就是在D中提供相应的构造函数,如:

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