2012-09-20 12 views
17

Czy to legalne C++?Czy możesz użyć rozmiaru jednego członka podczas deklarowania innego członka?

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

GCC 4.6 akceptuje to, ale MSVC 2012 nie. Wygląda na to, że powinno to być w porządku dla mnie, ale trochę Googling nie pomogło i nie wiem, gdzie szukać w standardzie.

MSVC 2012 daje następujący wynik:

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

możliwe duplikat [Dlaczego nie mogę zainicjować const statycznego członka lub statyczną tablicę w klasie?] (Http: // stackoverflow.com/questions/9656941/whyi-i-ant-initialize-non-const-static-member-lub-static-array-inclass) –

+2

Nawet jeśli ostateczna przyczyna jest podobna, to pytanie wygląda zupełnie inaczej niż ja . – Gorpik

+2

Odpowiedni akapit w standardzie C++ 11 to Klauzula 5, paragraf 8, myślę. – jrok

Odpowiedz

18

To było nielegalne w C++ 03, ponieważ te elementy są nonstatic datamembers.

Począwszy od C++ 11 jest to legalne, ponieważ w nieocenionym operandzie można używać niestatycznych danych bez posiadania odpowiedniego obiektu.

1

Spróbuj tego: To obejście MSVC 2010 i MSVC 2012

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

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