2012-05-02 15 views
13

Czy istnieje sposób ponownego użycia tej samej wartości wyliczeniowej w oddzielnych typach? Chciałbym móc coś jak następuje:Ponowne użycie wartości wyliczeniowych w oddzielnych typach wyliczeniowych

enum DeviceState { UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
enum DeviceType { UNKNOWN, PLAYBACK, RECORDING }; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DeviceState deviceState = DeviceState::UNKNOWN; 
    DeviceType deviceType = DeviceType::UNKNOWN; 
    return 0; 
} 

to sens do mnie, ale nie dla C++ compiler- narzeka: error C2365: 'UNKNOWN' : redefinition; previous definition was 'enumerator' on line 2 powyżej. Czy jest to właściwy sposób, czy też zawsze powinienem używać unikalnych wartości wyliczeniowych? Nie mogę sobie wyobrazić, że zawsze można to zagwarantować, jeśli dołączę kod kogoś innego.

Odpowiedz

15

Można i powinno zawierać Twoje teksty stałe w namespace:

namespace DeviceState 
{ 
    enum DeviceState{ UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
} 
namespace DeviceType 
{ 
    enum DeviceType{ UNKNOWN, PLAYBACK, RECORDING }; 
} 

//... 

DeviceType::DeviceType x = DeviceType::UNKNOWN; 
+0

Dzięki Luchian. Czy mógłbyś poprawić mój przykład dla mnie? Nie jestem pewien, jak zadeklarować zmienną przy użyciu przestrzeni nazw, jak opisano powyżej. –

+0

@AmAI, więc napisany przeze mnie kod nie działa? –

+0

Jeśli zadeklaruję zmienną jako 'DeviceState deviceState = DeviceState :: UNKNOWN;', pojawia się błąd kompilatora: ''DeviceState': niedozwolone użycie identyfikatora przestrzeni nazw w wyrażeniu' –

20

Dla tych z użyciem C++ 11, może wolisz używać:

enum class Foo 

zamiast po prostu:

enum Foo 

Zapewnia podobną składnię i korzyści z przestrzeni nazw. W twoim przypadku, składnia będzie:

enum class DeviceState { UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
DeviceState deviceState = DeviceState::UNKNOWN; 

pamiętać, że jest silnie wpisany więc trzeba będzie ręcznie odlewane im wskazówki (lub czegokolwiek innego).

Powiązane problemy