在我的课堂上,我定义了一个这样的枚举:
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]
不要将字段映射到整数吗?
答案 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;
}
}
这是一种实现选择,在非一致数据的情况下强制使用默认值。人们可能更喜欢抛出异常,在我的情况下它会这样做。