2012-09-20 14 views
17

È questo C++ legale?È possibile utilizzare la dimensione di un membro quando si dichiara un altro membro?

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

GCC 4.6 lo accetta, ma MSVC 2012 no. Sembra che dovrebbe andare bene per me, ma un po 'di Google non ha aiutato e non so dove cercare lo standard.

MSVC 2012 ha pronunciato la seguente uscita:

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

possibile duplicato del [Perché non riesco a inizializzare il membro statico non const o array statico in classe?] (Http: // stackoverflow.com/questions/9656941/why-i-cant-initialize-non-const-static-member-or-static-array-in-class) –

+2

Anche se la causa finale è simile, la domanda mi sembra molto diversa . – Gorpik

+2

Il paragrafo pertinente nello standard C++ 11 è la clausola 5, paragrafo 8, penso. – jrok

risposta

18

Questo era illegale in C++ 03, perché questi sono i membri datamembers non statici.

A partire da C++ 11 questo è legale poiché in un operando non valutato è possibile utilizzare datamembers non statici senza avere un oggetto corrispondente.

1

Prova questo: Si tratta di una soluzione per MSVC 2010 e MSVC 2012

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

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