2012-03-11 7 views
5

-std=c++11フラグを付けてコンパイルしても、GCCのバージョンではこのコードについて不満があり、gccバージョンではUnrestricted unions(> 4.6)がサポートされています。コンストラクタを持つクラスの匿名ユニオン/構造体

union 
{ 
    struct 
    { 
     float4 I,J,K,T; 
    }; 
    struct 
    { 
     float4 m_lines[4]; 
    }; 
    struct 
    { 
     float m16f[16]; 
    }; 
    struct 
    { 
     float m44f[4][4]; 
    }; 
}; 

float4にはデフォルト以外のコンストラクタがあり、0のパラメータを取ることに注意してください。

​​

私は何ができるでしょうか?エラーは次のとおりです。

<anonymous union>::<anonymous struct>::I’ with constructor not allowed in anonymous aggregate 
+0

'float4'クラスからコンストラクタを削除してください。 –

+1

@KerrekSB:まあ、いいえ、私はできません:) – qdii

+5

C++には匿名の構造体がありません。これはコンパイラの拡張機能です –

答えて

0

ここでの問題は、あなたのクラスfloat4はPODの古いC++ 03の定義の下で、それ以外のPODを作り、コンストラクタを持っているという事実ではありません。むしろ、問題は、あなたのユニオンとあなたのユニオン内の構造体が匿名であることです。

union u 
{ 
    struct s1 
    { 
     float4 I,J,K,T; 
    }; 
    struct s2 
    { 
     float4 m_lines[4]; 
    }; 
    struct s3 
    { 
     float m16f[16]; 
    }; 
    struct s4 
    { 
     float m44f[4][4]; 
    }; 
}; 
+4

「うまくいく」望ましい目標は何ですか?あなたは空の組合を作りました。私はこれが望まれていたのか疑問だ。 –

+1

ソリューションをありがとう、私の匿名の構造体を維持したいと思います:この共用体はクラス内にネストされています、私は名前を変更する場合は、すべての単一の呼び出しの名前を変更する必要があります。このコードはMSVC10でもうまく動作しますが、gccを正しく扱うことができたらいいと思います。 – qdii

+1

@qdiiの問題は、匿名の構造体が有効なC++でないことです。そのため、クロスプラットフォームコードを使用してこのコードを書くと、このようなコンパイラの問題が発生します。匿名の構造体を完全に使わない方が良いでしょう。 –

関連する問題