2012-01-13 13 views
5

Buduję klasę, która ma związek dla swoich danych macierzy, jednak mogę ją skompilować tylko wtedy, gdy nie mam nazwy dla struct \ union. Jednak z wyższego poziomu ostrzegawczego poziomu (cztery na visual studio) będę ostrzeżenie mówiącJak mogę zapobiec bezimiennej struct union?

warning C4201: nonstandard extension used : nameless struct/union 

Spojrzałem na niego, a nie wydaje się być w stanie znaleźć sposób, aby temu zapobiec. W każdym razie, o ile wiem, spowoduje to inny błąd kompilatora związany z deklaracją jednego lub drugiego. W jaki sposób mogę zapobiec otrzymaniu tego ostrzeżenia i dostosować go do standardów, nie wyłączając ostrzeżenia.

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]; 
    }; 

(Tak, wiem, że jest matric biblioteki dostępne. Proszę nie przekształcić to „wykorzystanie xxx biblioteki” dyskusji, robię to, aby rozwinąć swoją wiedzę o C++”).

+0

Dla dobra przyszłych czytelników, czy możesz pokazać swój kod, który nazywa strukturę i nie kompiluje? –

Odpowiedz

6

Nadawanie nazw wydaje się najlepszy. Anonimowych związki są dozwolone w C++, po prostu nie kodowanym.

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]; 
}; 

można użyć referencji/makra w celu umożliwienia dostępu bez bar.

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

Zasadniczo to samo, co anonimowa struktura. Nie polecam tego jednak. Użyj, jeśli to możliwe, bar._11.


Prywatne/publiczne (jakoś):

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

Wydaje się to robić. Chociaż nie jest to częścią pierwotnego pytania, czy istnieje sposób na uczynienie paska chronionym \ prywatnym, pozwalając jednocześnie _m na bycie publicznym? – mmurphy

+1

@mmurphy Zobacz moją aktualizację. To jest trochę możliwe. – Pubby

+0

Oh ok, interesujące. Ostatnią rzeczą, przyjrzałem się używaniu referencji (chciałbym użyć _11 jeśli to możliwe, bez przedrostka na nim). W jaki sposób zadeklarować odniesienie w klasie? Coś takiego jak "F32 i _11 = bar._11;" nie może być po prostu publicznie :. – mmurphy

3

Jeśli wszystko, co chcesz zrobić, to wyłączyć ostrzeżenie bez zmieniania rzeczywisty kod można użyć dyrektywy #pragma warning tak:

#pragma warning(disable : 4201) 

Jeśli chcesz ponownie go włączyć, użyj:

#pragma warning(default : 4201) 

Aby uzyskać dodatkowe informacje, patrz MSDN documentation.

+0

Przepraszam, powinienem być bardziej szczegółowy i powiedzieć bez wyłączania ostrzeżenia – mmurphy

-1

Masz to ostrzeżenie nie o wewnętrznej strukturze, ale o samej zjednoczeniu. Wypróbuj to:

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;