2013-02-28 11 views
9

Próbuję użyć poprawnie przekazania deklaracji do wyliczenia. Dlatego przeszukałem internet, ale nie mogę znaleźć czegoś, co działa.Enum Forward Declaration

używam w nagłówku:

// Forward declaration 
enum myEnumProcessState; 

jestem następnie za pomocą tego wyliczenia w struct:

struct myStruct { 
    [...] 
    myEnumProcessState osState; 
    [...] 
}; 

A w innym nagłówkiem:

enum myEnumProcessState { 
    eNotRunning, 
    eRunning 
}; 

I okazało się, że typ powinien zostać umieszczony w deklaracji forward, aby zostać zaakceptowanym. Jednak nie wiem, który "typ" powinienem umieścić w stanie procesu. Te nie działają:

enum myEnumProcessState : unsigned int; 
enum myEnumProcessState : String; 

Chciałem pominąć deklarację naprzód, ale mój Struct płacze, ponieważ nie można go znaleźć już ...

Więc jestem trochę zdezorientowany. Czy znasz rozwiązanie?

Dziękujemy :)

+0

dlaczego trzeba do przekazania zadeklarować go może? po prostu zdefiniuj go, zanim go użyjesz (to znaczy dołącz plik zawierający enum/przenieś enum do pliku, który może być zawarty w obu plikach)? – Default

+0

Cóż ... TO działa. chciałem zrobić to z deklaracją terminową Teraz, jeśli jedynym "czystym" rozwiązaniem jest pominięcie, będę ... –

+0

Tak naprawdę nie wiem, czy istnieje rozwiązanie tego problemu. zobacz powód, dla którego chcesz to zrobić .. – Default

Odpowiedz

16

Przed C++ 11, C++ nie obsługują przód-deklarację teksty stałe w ogóle! Jednak niektóre kompilatory (np. MS Visual Studio) udostępniają rozszerzenia językowe.

Jeśli twój kompilator nie obsługuje C++ 11, zajrzyj do jego dokumentacji na temat deklaracji do przodu.

Jeśli można użyć C++ 11, jest składnia enum class (prawie, ale to dobrze, ale należy zwrócić uwagę na dodatkowe class słów kluczowych:

// Forward declaration 
enum class myEnumProcessState: unsigned int; 

// Usage in a struct 
struct myStruct {myEnumProcessState osState;}; 

// Full declaration in another header 
enum class myEnumProcessState: unsigned int { 
    eNotRunning, 
    eRunning 
}; 

// Usage of symbols (syntax may seem slightly unusual) 
if (myObject.osState == myEnumProcessState::eNotRunning) { 
    ... 
} 
+0

Hm. Kiedy to dodam, otrzymałem komunikat "error: expected" {'before ";' token on the ligne "enum class myEnumProcessState: unsigned int;" ... –

+0

Wygląda na to, że twój kompilator obsługuje C++ 03, ale nie C++ 11. Deklaracje forward dla enums nie są obsługiwane w C++ 03, ale niektóre kompilatory obsługują je jako rozszerzenie języka (niezależnie od tego, czy powinieneś używać tych rozszerzeń to cała inna puszka robaków). – anatolyg

+0

To jest G ++ 4.7.2, domyślam się, że domyślnie podąża za C++ 11. Czy to nie ? –