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

时间:2012-01-02 17:49:23

标签: c++ enums

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

class myClass 
{
 public:
    enum access {
      forL,
      forM,
      forA
    };
    typedef access AccessType;
    AccessType aType;
};

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

myClass ob;
ob->aType = 0;

但是我收到了这个错误:

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

不要将字段映射到整数吗?

4 个答案:

答案 0 :(得分:20)

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

myClass ob;
ob->aType = (myClass::AccessType)0;

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

myClass ob;
ob->aType = myClass::forL;

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

class myClass 
{
 public:
    enum {
      forL,
      forM,
      forA
    };
    int aType; // just stores numbers
};

从enum到int的转换是隐含的。

答案 1 :(得分:9)

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

ob->aType = static_cast<myClass::access>(0);

答案 2 :(得分:3)

你不能从int进行隐式转换 - &gt;枚举,因为在编译时无法知道演员表是否有效。

可以以其他方式隐式转换,所以你可以(如果你愿意)做:

int foo = forL;

答案 3 :(得分:1)

我刚遇到同样的问题。 我必须从我在xml文件中读取的内容初始化一个对象,当然,我无法控制该文件会发生什么。

构造函数有一个枚举作为参数:

enum status_t { NOT_STARTED, STARTED, DONE };
MyObject::MyObject(int id, status_t status) : m_id(id), m_status(status){}

因此在解析Xml时我必须强制转换它。我更喜欢在构造函数中处理强制转换,因此其他类不必知道哪个是有效的枚举。

MyObject::MyObject(int id, int status) : m_id(id){
    m_status = status_t(status);
}

但无法确定来自xml的值是否在正确的范围内。

这是我带来的解决方案:

MyObject::MyObject(int id, int status) : m_id(id){
    switch(status){
        case NOT_STARTED:
        case STARTED:
        case DONE:
            m_status=status_t(status);
            break;
        default:
            m_status=NOT_STARTED;
            break;
    }
}

这是一种实现选择,在非一致数据的情况下强制使用默认值。人们可能更喜欢抛出异常,在我的情况下它会这样做。