Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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;
    }
}

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