在switch case中混合枚举类和unsigned int的C ++ 11将无法编译

时间:2015-01-11 23:53:12

标签: c++ c++11 enum-class

为什么这段代码不能编译,我该怎么做才能编译?

#include <iostream>
using namespace std;

enum class myEnum : unsigned int
{
    bar = 3
};

int main() {
    // your code goes here

    unsigned int v  = 2;
    switch(v)
    {
        case 2:
        break;

        case myEnum::bar:
        break;
    }

    return 0;
}

ideone:

https://ideone.com/jTnVGq

prog.cpp: In function 'int main()':
prog.cpp:18:16: error: could not convert 'bar' from 'myEnum' to 'unsigned int'
   case myEnum::bar:

未能在GCC和Clang中建立,在MSVC 2013中有效。

4 个答案:

答案 0 :(得分:12)

enum class的整个目的是使其成员无法直接与int进行比较,表面上提高了C ++ 11相对于C ++的类型安全性03 。从class删除enum class,这将编译。

引用Bjarne勋爵:

  

(An)enum class(作用域枚举)是enum,其中枚举数在枚举范围内,并且不提供对其他类型的隐式转换。

答案 1 :(得分:4)

你可以简单地使用这样的语法:

enum class Test { foo = 1, bar = 2 };
int main()
{
  int k = 1;
  switch (static_cast<Test>(k)) {
    case Test::foo: /*action here*/ break;
  }
}

答案 2 :(得分:2)

继续使用enum class的替代方法是添加一个代表值为myEnum的新字段。然后,您可以将unsigned int v更改为myEnum v

enum class myEnum : unsigned int
{
    foo = 2,
    bar = 3
};

int main() {
    myEnum v = myEnum::foo;
    switch(v)
    {
        case myEnum::foo:
        break;

        case myEnum::bar:
        break;
    }
}

答案 3 :(得分:-1)

使用类并切换大小写的枚举的示例,这是从另一个类调用枚举类的正确方法。

class MyClass 
{
public:

enum class colors {yellow , blue , green} ; 

};


int main ()
{

Myclass::colors c = Myclass::colors::yellow;
 
switch(c)
{
case Myclass::colors::yellow:
cout <<"This is color yellow \n"
case Myclass::colors::blue:
cout <<"This is color blue\n"

}

return 0 ; 
}