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

C++11 mixing enum class and unsigned int in switch case will not compile

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

#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 中运行。

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

引用 Bjarne 勋爵的话:

(An) enum class (a scoped enumeration) is an enum where the enumerators are within scope of the enumeration and no implicit conversions to other types are provided.

继续使用 enum class 的替代方法是向 myEnum 添加一个表示值 2 的新字段。然后你可以把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;
    }
}

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

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

enum 使用 classes 和 switch case 的示例,这是调用 enum class 来自另一个 class.

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