2012-01-13 11 views
5

私は、その行列データ用の共用体を持つクラスを構築していますが、struct \ unionの名前がない場合にのみコンパイルできます。しかし、より高いレベルの警告レベル(Visual Studioの上に4つ)と私は警告が名前なしの構造体共用体を防ぐにはどうしたらいいですか?

warning C4201: nonstandard extension used : nameless struct/union 

を言ってます私はそれに見て、私はこれを防止するための方法を見つけることができていないようです。とにかく私が知っていることは、どちらか一方の宣言に関連する異なるコンパイラエラーを引き起こすでしょう。警告を無効にするだけでなく、どのようにしてこの警告が表示されるのを防ぎ、標準に準拠させることができますか。

union 
    { 
     struct 
     { 
      F32 _11, _12, _13, _14; 
      F32 _21, _22, _23, _24; 
      F32 _31, _32, _33, _34; 
      F32 _41, _42, _43, _44; 
     }; 
     F32 _m[16]; 
    }; 

(はい、私は可能なマトリックのライブラリが存在しているはず。「xxxのライブラリを使用する」の議論にこれを有効にしないでください、私は「C++の私の知識を広げるためにこれをやっているが。)

+0

将来の読者のために、構造体に名前を付けてコンパイルしないコードを表示できますか? –

答えて

6

ネーミングそれが最高のようだ。匿名組合は、C++で許可されているだけではない構造体。

union 
{ 
    struct foo 
    { 
     F32 _11, _12, _13, _14; 
     F32 _21, _22, _23, _24; 
     F32 _31, _32, _33, _34; 
     F32 _41, _42, _43, _44; 
    } bar; 
    F32 _m[16]; 
}; 

あなたはbarせずにアクセスを許可するための参照/マクロを使用することができます。

F32& _11 = bar._11; 
F32& _12 = bar._12; 

匿名の構造体と本質的に同じです。私は本当にこれをお勧めしません。可能であればbar._11を使用してください。


(みかん)パブリック/プライベート:

struct mat 
{ 
    struct foo 
    { 
    friend class mat; 
    private: 
     F32 _11, _12, _13, _14; 
     F32 _21, _22, _23, _24; 
     F32 _31, _32, _33, _34; 
     F32 _41, _42, _43, _44; 
    }; 
    union 
    { 
    foo bar; 
    F32 _m[16]; 
    }; 
}; 
+0

それはそうするようです。元の質問の一部ではありませんが、_mをパブリックにしながらbarを\ privateに保護する方法はありますか? – mmurphy

+1

@mmurphy私の更新を見てください。それはいくぶん可能です。 – Pubby

+0

ああ、面白いです。最後に、参照を使用して調べました(できるだけ_11を使用したいと思いますが、接頭辞は付けません)。クラス内で参照をどのように宣言できますか? "F32&_11 = bar._11;"のようなもの公にすることはできません:。 – mmurphy

3

あなたがしたいすべては、あなたがそうのような#pragma warningディレクティブを使用することができ、実際のコードを変更せずに、警告を無効にする場合:

#pragma warning(disable : 4201) 

再度有効にしたい場合は、再度使用してください:

#pragma warning(default : 4201) 

追加リファレンスについては、MSDN documentationを参照してください。

+0

申し訳ありませんが、警告を無効にするだけでなく、 – mmurphy

-1

この警告は、内部構造体ではなく、ユニオン自体についての警告です。これを試してください:

union Mat // <------- 
{ 
    struct 
    { 
     F32 _11, _12, _13, _14; 
     F32 _21, _22, _23, _24; 
     F32 _31, _32, _33, _34; 
     F32 _41, _42, _43, _44; 
    }; 
    F32 _m[16]; 
}; 

Mat mat; 
mat._11 = 42; 
F32 x = mat._22; 
mat._m[ 3 ] = mat._33; 
関連する問題