2014-11-19 21 views
14

So che in C++ 11 è possibile inoltrare un tipo enum (se è fornito il tipo di memoria) ad es.La dichiarazione di enum forward in classe è possibile?

enum E : short; 
void foo(E e); 

.... 

enum E : short 
{ 
    VALUE_1, 
    VALUE_2, 
    .... 
} 

Ma vorrei inoltrare un enum definito all'interno di una classe, ad es.

enum Foo::E : short; 
void foo(E e); 

.... 

class Foo 
{ 
    enum E : short 
    { 
     VALUE_1, 
     VALUE_2, 
    .... 
    } 
} 

È qualcosa del genere possibile in C++ 11?

+1

Che dire in avanti dichiarando la classe prima di enum tale 'classe Foo;'? –

+1

Ne dubito. Non è possibile inoltrare le funzioni membro dichiarate, typedefs, ect. Perché questo dovrebbe essere diverso? (Le classi C++ sono chiuse, il che significa che non possono essere modificate dopo la def.) Vedi anche http://stackoverflow.com/questions/836551/forward-declare-a-classs-public-typedef-in-c – IdeaHat

+0

A differenza delle classi, gli spazi dei nomi possono essere aggiunti da qualsiasi luogo. Perché non mettere l'enum e la classe in uno spazio dei nomi? –

risposta

6

No, tale dichiarazione anticipata non è possibile. [Decl.enum]/5 (sottolineatura mia grassetto):

Se il enum-chiave è seguito da un nested-nome-identificatore, il enum-specifier deve fare riferimento a un enumerazione che era precedentemente dichiarati direttamente nella classe o spazio a cui il nested-nome-specificatore riferisce (cioè né ereditato né introdotto da una dichiarazione using), e il enum-specificatore sh appaiono tutti in uno spazio dei nomi che racchiude la dichiarazione precedente.

(In questo caso il nested-nome-specificatore sarebbe il nome della classe seguito da un ::.)
Si potrebbe, però, mettere l'enumerazione di fuori e utilizzare un opaco-enum dichiarazione .

2

Come dice @Columbo, non è possibile dichiararlo nel modulo specificato.

È possibile, tuttavia, in avanti dichiarare l'enum nidificato all'interno della dichiarazione della classe:

class Foo 
{ 
    enum E : short; 
}; 

void foo(Foo::E e); 

enum Foo::E : short 
{ 
    VALUE_1, 
    VALUE_2, 
    .... 
}; 

Sia che si guadagna alcun beneficio in questo modo dipende, ovviamente, dalle circostanze.