2012-03-11 24 views
5

GCC se queja de este código aunque compilo con -std=c++11, y mi versión de gcc supuestamente admite uniones no restringidas (> 4.6).Unión/estructura anónima de clase con el constructor

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

Tenga en cuenta que float4 tiene un constructor no predeterminado que toma 0 parámetros.

class float4 
{ 
    public: 
     float4(); 
.... 
}; 

¿Alguna idea de qué podría hacer? El error es:

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

Elimine el constructor de su clase 'float4'. –

+1

@KerrekSB: Bueno, no, no puedo :) – qdii

+5

C++ no tiene estructuras anónimas ... es una extensión de tu compilador –

Respuesta

0

El tema aquí no es el hecho de que su clase float4 tiene un constructor, por lo que es un no-POD bajo la antigua C++ 03 definición de POD. Más bien, el problema es que su sindicato y las estructuras dentro de su sindicato son anónimas. Si simplemente los nombra, funcionará:

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

"funcionará". ¿Cuál es el objetivo deseado? usted ha creado una unión vacía. dudo que esto sea deseado sin embargo. –

+1

Gracias por la solución, pero me gustaría mantener mis estructuras anónimas: esta unión está anidada dentro de una clase y si cambio los nombres, tendría que cambiar el nombre de cada llamada. Este código funciona bien en MSVC10, ojalá pudiera ajustar gcc para tratarlo correctamente también. – qdii

+1

@qdii, el problema es que las estructuras anónimas no son válidas en C++, por lo que se encontrará con problemas de compilación como este todo el tiempo si intenta escribir código multiplataforma utilizandolas. Sería más útil evitar el uso de estructuras anónimas por completo. –

Cuestiones relacionadas