Использование 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]

Не перечислять поля для целых чисел?

+17
02 янв. '12 в 17:49
источник поделиться
4 ответа

Нет, они хранятся как целые числа, но они различаются типами (например, вы можете даже перегружать на основе типа перечисления). Вы должны явно преобразовать:

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 неявно.

+15
02 янв. '12 в 17:53
источник

Элементы перечисления поддерживаются целыми значениями, но нет никакого неявного преобразования из целого числа в тип перечисления. Вам нужно использовать явный приведение, если вы действительно хотите написать его следующим образом:

ob->aType = static_cast<myClass::access>(0);
+8
02 янв. '12 в 17:54
источник

Вы не можете выполнить неявный отбор из int → enum, так как во время компиляции невозможно узнать, что акты действительны.

Вы можете делать неявные броски другим способом, чтобы вы могли (если хотите):

int foo = forL;
+2
02 янв. '12 в 17:54
источник

У меня была такая же проблема. я должен инициализировать объект из того, что я читал в 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;
    }
}

Это выбор реализации, чтобы заставить значение по умолчанию в случае несогласованных данных. Можно предпочесть выкинуть исключение, в моем случае это будет сделано так.

0
11 июл. '17 в 16:15
источник

Посмотрите другие вопросы по меткам или Задайте вопрос