使用enum表示从'int'到'type'的无效转换

mah*_*ood 24 c++ enums

在我的课上,我定义了一个这样的枚举:

class myClass 
{
 public:
    enum access {
      forL,
      forM,
      forA
    };
    typedef access AccessType;
    AccessType aType;
};
Run Code Online (Sandbox Code Playgroud)

后来定义了这样一个对象:

myClass ob;
ob->aType = 0;
Run Code Online (Sandbox Code Playgroud)

但是我收到此错误:

error: invalid conversion from 'int' to 'myClass::AccessType {aka myClass::access}' [-fpermissive]

不要将字段映射到整数?

ybu*_*ill 20

不,它们存储为整数但它们是不同的类型(例如,您甚至可以基于枚举类型重载).您必须明确转换:

myClass ob;
ob->aType = (myClass::AccessType)0;
Run Code Online (Sandbox Code Playgroud)

或者更好地编写枚举的相应命名值:

myClass ob;
ob->aType = myClass::forL;
Run Code Online (Sandbox Code Playgroud)

或者,如果您想将枚举用作一组整数常量,请更改字段的类型:

class myClass 
{
 public:
    enum {
      forL,
      forM,
      forA
    };
    int aType; // just stores numbers
};
Run Code Online (Sandbox Code Playgroud)

从枚举到int的转换是隐含的.

  • 我建议为此正确的C++演员:`auto exampleEnum = static_cast <MyClass :: AccessType>(exampleInt);` (3认同)

bob*_*mcr 9

枚举成员由整数值支持,但没有从整数到枚举类型的隐式转换.如果你真的想像这样编写它,你需要使用显式转换:

ob->aType = static_cast<myClass::access>(0);
Run Code Online (Sandbox Code Playgroud)

  • 只要指定的整数在枚举的有效范围内,任何符合标准的编译器都应该按照C++规范的7.2.10允许:"算术或枚举类型的表达式可以显式转换为枚举类型.如果它在枚举类型的枚举值范围内,则该值不变;否则,未指定生成的枚举值." (3认同)