2

最初の構造体にコンストラクターがある場合、この 2 番目の構造体を機能させるにはどうすればよいですか? エラーが発生します:

error C2620: member 'test::teststruct::pos' of union 'test::teststruct::<unnamed-tag>' has user-defined constructor or non-trivial default constructor

コード:

struct xyz {
    Uint8 x, y, z, w;
    xyz(Uint8 x, Uint8 y, Uint8 z) : x(x), y(y), z(z) {}
};
struct teststruct {
    union {
        Uint32 value;
        xyz pos; // error at this line.
    };
};

関数を使用して xyz 構造体を初期化することもできますが、それはかなり遅くなりませんか? 言うまでもなく、init_xyz() などのプレフィックスを使用して独自の関数を作成する必要がある構造体がたくさんありますが、これは良くありません。この問題を回避する他の方法はありますか?

4

2 に答える 2

5

おそらくこれを避けるために:

struct A {
    Uint8 a;
    A() : a(111) {}
};

struct B {
    Uint8 b;
    B() : b(2222) {}
};

struct teststruct {
    union {
        A aValue;
        B bValue;
    };
};

A コンストラクターと B コンストラクターはどちらも同じメモリを異なる方法で初期化しようとします。どちらが勝つかを示す何らかのルールを設ける代わりに、ユーザー定義のコンストラクターは許可されていないと言う方がおそらく簡単でした。

于 2012-06-20T11:15:08.973 に答える
1

C++03 から、9.5 ユニオン、pg 162

共用体にはメンバー関数 (コンストラクターとデストラクタを含む) を含めることができますが、仮想 (10.3) 関数を含めることはできません。共用体には基底クラスがあってはなりません。共用体は基本クラスとして使用してはなりません。非自明なコンストラクタ (12.1)、非自明なコピー コンストラクタ (12.8)、非自明なデストラクタ (12.4)、または非自明なクラスのオブジェクトコピー代入演算子 (13.5.3、12.8) は共用体のメンバーにすることも、そのようなオブジェクトの配列にすることもできません

于 2012-06-21T22:36:40.713 に答える