2012-05-30 46 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。