0

我目前正在使用 Visual Studio 11 Beta。我正在使用强类型枚举来描述一些标志

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
4

2 回答 2

2

强类型枚举不能隐式转换为整数类型,即使它的基础类型是uint32_t,您需要显式转换uint32_t以实现您正在做的事情。

于 2012-05-30T00:38:44.880 回答
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,因为它是 enum 类的用途:限制来自 enum 的整数值,消除一些值检查,除非显式 static_casts 往返于 enum 类-值被使用。

于 2012-05-30T10:38:06.160 回答