-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::bB::BD::d

struct D : B  {
  D(int d_) : B(d_), d(d_) {}
  int d;
};

いずれにせよ、あなたのコードはDint.

コードと私のスニペットを使用した実際の例へのリンク: 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 に答える