2012-05-02 107 views
13

有沒有辦法在不同的類型中重用相同的枚舉值?我希望能像下面這樣:在單獨的枚舉類型中重用枚舉值

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; 
} 

這對我來說很有意義,而不是C++的反編譯它抱怨:error C2365: 'UNKNOWN' : redefinition; previous definition was 'enumerator'以上的2號線。有沒有這樣做的正確方法,或者我應該總是使用獨特的枚舉值?我無法想象,如果我包含別人的代碼,這總是可以保證。

回答

15

可以,而且應該包括你的枚舉在namespace

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

//... 

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

謝謝Luchian。請你能幫我糾正我的例子。如上所述,我不確定如何使用名稱空間聲明變量。 –

+0

@IAmAI所以我發佈的代碼不起作用? –

+0

如果我聲明一個變量爲'DeviceState deviceState = DeviceState :: UNKNOWN;',我得到一個編譯器錯誤:''DeviceState':非法使用表達式中的名稱空間標識符 –

20

對於使用C++ 11的,你可能更願意使用:

enum class Foo 

,而不只是:

enum Foo 

這提供了與命名空間相似的語法和好處。在你的情況下,語法是:

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

注意,這是強類型,所以你需要手動將它們轉換成整數(或其他任何東西)。