-1
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 ‘&lt;brace-enclosed initializer list>’ to ‘D’

即使我删除“构造函数”行也是如此。如果我删除=标志,即D obj {1};它给出如下:

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

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

4

2 回答 2

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

于 2014-07-21T10:37:48.853 回答
1

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

struct D : B  {
  D(int i) : B(i) {}//;
  int d;
};
于 2014-07-21T10:39:08.823 回答