2012-09-20 19 views
17

¿Es esto legal C++?¿Se puede usar el tamaño de un miembro cuando se declara a otro miembro?

struct foo 
{ 
    int a[100]; 
    int b[sizeof(a)/sizeof(a[0])]; 
}; 

GCC 4.6 lo acepta, pero MSVC 2012 no. Parece que debería estar bien para mí, pero un poco de Google no ayudó y no sé dónde buscar en el estándar.

MSVC 2012 da el siguiente resultado:

error C2327: 'foo::a' : is not a type name, static, or enumerator 
error C2065: 'a' : undeclared identifier 
error C2070: ''unknown-type'': illegal sizeof operand 
warning C4200: nonstandard extension used : zero-sized array in struct/union 
+0

posible duplicado de [¿Por qué no puedo inicializar el miembro estático no constante o matriz estática en la clase?] (Http: // stackoverflow.com/questions/9656941/why-i-cant-initialize-non-const-static-member-or-static-array-in-class) –

+2

Aunque la causa final sea similar, la pregunta es muy diferente para mí . – Gorpik

+2

El párrafo relevante en el estándar C++ 11 es Cláusula 5, párrafo 8, creo. – jrok

Respuesta

18

Ésta era ilegal en C++ 03 debido a que estos miembros son datamembers no estáticos.

A partir de C++ 11 esto es legal ya que en un operando no evaluado puede usar los datos no estáticos sin tener un objeto correspondiente.

1

Prueba esto: Esta es una solución para MSVC 2010 y MSVC 2012

struct Aoo 
{ 
    typedef int ArrayType; 
    ArrayType a[100]; 
}; 

struct foo : public Aoo 
{ 
    enum {bSize = sizeof(Aoo)/sizeof(Aoo::ArrayType)}; 
    int b[bSize]; 
}; 
Cuestiones relacionadas