¿Cómo puedo prevenir una estructura anónima sin nombre?

Estoy creando una clase que tiene una unión para sus datos matriciales, sin embargo, solo puedo comstackrla cuando no tengo un nombre para la estructura \ unión. Sin embargo, con un nivel de advertencia de nivel superior (cuatro en visual studio), aparecerá un mensaje de advertencia.

warning C4201: nonstandard extension used : nameless struct/union 

Lo busqué y parece que no puedo encontrar una manera de evitar esto. De todos modos, es posible que sepa que causará un error de comstackdor diferente relacionado con la statement de uno u otro. ¿Cómo puedo evitar recibir esta advertencia y hacer que se ajuste a las normas, sin solo 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 matriciales disponibles. Por favor, no convierta esto en una discusión de “usar la biblioteca xxx”, estoy haciendo esto para ampliar mi conocimiento de C ++ “.)

Nombrarlo parece mejor. Los sindicatos anónimos están permitidos en C ++, pero no en 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. Aunque realmente no recomiendo esto. Use bar._11 si es posible.


Privado / público (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]; }; }; 

Si todo lo que quiere hacer es desactivar la advertencia sin cambiar el código real, entonces puede usar la directiva de #pragma warning así:

 #pragma warning(disable : 4201) 

Si quieres volver a habilitarlo de nuevo usa:

 #pragma warning(default : 4201) 

Para referencia adicional, vea la documentación de MSDN.

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

Lo arreglé sin darle un nombre a la clase estructura, solo el nombre de la instancia.

Tiene esta advertencia no sobre la estructura interna sino sobre la unión misma. Prueba 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;