2012-05-30 73 views
0

我正在玩Visual Studio 11 Beta。我使用的是強類型枚舉來形容一些標誌在Visual Studio 11中強類型枚舉類(測試版)

enum class A : uint32_t 
{ 
    VAL1 = 1 << 0, 
    VAL2 = 1 << 1, 
}; 
uint32_t v = A::VAL1 | A::VAL2; // Fails 

當我試圖如上我收到以下錯誤

error C2676: binary '|' : 'A' does not define this operator or a conversion to a type acceptable to the predefined operator 

把它們結合起來這與編譯器錯誤或就是我根據C++ 11標準嘗試無效?

我的假設是,大家以前枚舉聲明就相當於寫

struct A 
{ 
    enum : uint32_t 
    { 
     VAL1 = 1 << 0, 
     VAL2 = 1 << 1, 
    }; 
}; 
uint32_t v = A::VAL1 | A::VAL2; // Succeeds, v = 3 
+0

可能的重複[在C++中使用C標誌枚舉](http://stackoverflow.com/questions/10339076/using-c-flag-enums-in-c) – dasblinkenlight

+2

@dasblinkenlight:我不認爲它是一個確切的重複,因爲這個問題是關於從'枚舉'轉換爲'int',這是正常的枚舉罰款。 –

+2

如果枚舉可以隱式轉換爲不同的類型,那麼它不會完全是強類型的......你確定你不想只是普通的舊'enum'嗎? – ildjarn

回答

2

強類型的枚舉不是隱式轉換爲整數類型即使它的基本類型是uint32_t,你需要顯式轉換到uint32_t來實現你在做什麼。

0

強類型枚舉沒有任何形式的運算符|。看看有:http://code.google.com/p/mili/wiki/BitwiseEnums

有了這個只有標題庫,你可以編寫代碼就像

enum class WeatherFlags { 
    cloudy, 
    misty, 
    sunny, 
    rainy 
} 

void ShowForecast (bitwise_enum <WeatherFlags> flag); 

ShowForecast (WeatherFlags::sunny | WeatherFlags::rainy); 

地址:無論如何,如果你想uint32_t的價值,你就必須轉換bitwise_enum明確uint32_t的,因爲它是枚舉類用於:限制枚舉類型的整數值,以消除一些值檢查,除非使用了來自和來自枚舉類值的顯式static_casts。