0

私はC++の用語にかなり慣れていないので、タイトルがあまりにもずれていないことを願っています。しかし、私は誰かが私に言うだろうと100%確信しています;)

私はこのコードを持っています:

struct B {
  struct A {
    A() : a(0) { }
    A(int a) { this->a = a; }
    int a;
  }
    a0,    // OK
    a1(1); // NOT OK!

  B() : b(0) { }
  B(int b) { this->b = b; }
  int b;
}
  b0,    // OK
  b1(1); // OK

しかし、gccはコンパイルに失敗し、次の出力を生成します。

8:8: error: expected identifier before numeric constant
8:8: error: expected ‘,’ or ‘...’ before numeric constant
2:3: error: new types may not be defined in a return type
2:3: note: (perhaps a semicolon is missing after the definition of ‘B::A’)

'a1(1)'オブジェクトを削除するか、'a1'に変更すると、問題なくコンパイルされます。しかし、「A(int a)」コンストラクターを使用することはできません。同様ですか?オブジェクト「b1」は、そのコンストラクターに問題はありません。これの説明は何ですか?ありがとう :)

4

4 に答える 4

3

オブジェクトとインスタンスが一致していません。静的constでない限り、クラスBの定義に事前に作成されたオブジェクト(Aのインスタンス)を含めることはできませんが、クラス宣言で初期化することはできません。

于 2012-05-17T16:45:46.987 に答える
3

class / struct定義内でメンバー変数を初期化することは許可されていません(例外:static constintegral(eg int、、shortboolmembers)

b0およびの場合、b1メンバー変数ではなく、2つのグローバル変数を宣言(および初期化)します。

于 2012-05-17T16:46:13.070 に答える
2

a0およびa1は外部構造体のメンバーであり、通常の属性と同様に、インラインで初期化することはできません。a0初期化しa1て、Bコンストラクターのイニシャライザーリストに入れる必要があります。

于 2012-05-17T16:47:36.210 に答える
2

正しい構文を求めている場合..、

struct B {
    struct A {
        int a;

        A()      : a(0) { }
        A(int a) : a(a) { }
    } a0, a1;

    int b;

    B()      : a0(), a1(1), b(0) { }
    B(int b) : a0(), a1(1), b(b) { }
} b0, b1(1);
于 2012-05-17T16:49:21.103 に答える