Использование enum говорит о неверном преобразовании из 'int' в 'type'
В моем классе я определил перечисление следующим образом:
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]
Не перечислять поля для целых чисел?
Ответы
Ответ 1
Нет, они хранятся как целые числа, но они различаются типами (например, вы можете даже перегружать на основе типа перечисления). Вы должны явно преобразовать:
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 неявно.
Ответ 2
Элементы перечисления поддерживаются целыми значениями, но нет никакого неявного преобразования из целого числа в тип перечисления. Вам нужно использовать явный приведение, если вы действительно хотите написать его следующим образом:
ob->aType = static_cast<myClass::access>(0);
Ответ 3
Вы не можете выполнить неявный отбор из int → enum, так как во время компиляции невозможно узнать, что акты действительны.
Вы можете делать неявные броски другим способом, чтобы вы могли (если хотите):
int foo = forL;
Ответ 4
У меня была такая же проблема.
я должен инициализировать объект из того, что я читал в XML файле, и, конечно, я не могу контролировать, что может случиться с этим файлом.
Конструктор имеет enum в качестве аргумента:
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;
}
}
Это выбор реализации, чтобы заставить значение по умолчанию в случае несогласованных данных. Можно предпочесть выкинуть исключение, в моем случае это будет сделано так.