2012-01-13 9 views
5

Estoy construyendo una clase que tiene una unión para sus datos de matriz, sin embargo, solo puedo obtenerla cuando no tengo un nombre para struct \ union. Sin embargo, con un nivel de advertencia de nivel superior (cuatro en Visual Studio) Voy a una advertencia diciendo¿Cómo puedo evitar una estructura union sin nombre?

warning C4201: nonstandard extension used : nameless struct/union 

miré en él, y que no parecen ser capaces de encontrar una manera de prevenir esto. De todos modos, lo que yo sepa, causará un error de compilación diferente relacionado con la declaración de uno u otro. ¿Cómo puedo evitar recibir esta advertencia y hacer que cumpla con los estándares, sin simplemente deshabilitar la advertencia?

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

(Sí, sé que hay bibliotecas matricial disponibles. Por favor, no convertir esto en una discusión "XXX biblioteca", que estoy haciendo esto para ampliar mis conocimientos de C++".)

+0

Para el beneficio de los lectores futuros, ¿puede mostrar el código que nombra la estructura y no compila? –

Respuesta

6

Naming parece mejor. uniones anónimos están permitidos en C++, pero no estructuras.

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

puede utilizar referencias/macros para permitir el acceso sin bar.

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

Esencialmente lo mismo que una estructura anónima. Realmente no lo recomiendo. Use bar._11 si es posible.


privada/pública (sorta):

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

Eso parece hacerlo. Aunque no es parte de la pregunta original, ¿hay alguna forma de proteger el bar de lo privado y al mismo tiempo permitir que _m sea público? – mmurphy

+1

@mmurphy Ver mi actualización. Es algo posible. – Pubby

+0

Oh, bien, interesante. Una última cosa, investigué el uso de referencias (me gustaría usar _11 si es posible, sin el prefijo). ¿Cómo podría declararse la referencia en la clase? Algo como "F32 & _11 = bar._11;" no puede ser solo en público: – mmurphy

3

Si todo lo que quiere hacer es desactivar la advertencia sin cambiar el código real entonces usted puede utilizar #pragma warning Directiva de esta manera:

#pragma warning(disable : 4201) 

Si desea volver a activar de nuevo uso:

#pragma warning(default : 4201) 

Para referencia adicional, vea MSDN documentation.

+0

Lo siento, debería haber sido más específico y haber dicho sin deshabilitar la advertencia – mmurphy

-1

Tiene esta advertencia no sobre la estructura interna sino sobre la unión misma. Pruebe esto:

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; 
Cuestiones relacionadas