ошибка: неверное преобразование из int в enum c ++ - PullRequest
2 голосов
/ 19 февраля 2020

Я получаю сообщение об ошибке: недопустимое преобразование из int в num, когда я компилирую приведенный ниже пример кода на c ++. Повторная установка его с помощью enum name не помогает.

#include <iostream>
using namespace std;
typedef enum
{
    NUM_ZERO = 0,
    NUM_ONE = 1,
    NUM_TWO = 2,
    NUM_THREE = 4
} num;

int main()
{
    num* numFlag;
    *numFlag |= static_cast<num>(NUM_TWO);
    return 0;
}

Пожалуйста, дайте мне знать, если кто-нибудь знает, как решить эту проблему.

Ответы [ 3 ]

6 голосов
/ 19 февраля 2020

Синтаксически говоря,

*numFlag |= static_cast<num>(NUM_TWO);

эквивалентно

*numFlag = (*numFlag | static_cast<num>(NUM_TWO));

Это объясняет предупреждение / ошибку компилятора. Вам нужно будет привести результат оператора |.

*numFlag = static_cast<num>(*numFlag | NUM_TWO);

Чтобы он работал, вы должны использовать

int main()
{
    // Make numFlag an object instead of a pointer.
    // Initialize it.
    num numFlag = NUM_ZERO;

    // Perform the bitwise |
    numFlag = static_cast<num>(numFlag | NUM_TWO);

    return 0;
}
1 голос
/ 19 февраля 2020

В соответствии с именем переменной и выполняемой вами операцией тип numFlag должен быть int или int *, если вам нужен указатель вместо этого. В противном случае вы можете иметь неопределенное поведение, если попытаетесь сохранить несколько флагов в этой переменной / памяти (и в соответствии со значениями этих флагов, которые вы предполагаете сделать):

int numFlag = NUM_ZERO;
numFlag |= NUM_TWO; // no casting is necessary 
numFlag |= NUM_ONE; // and it will not lead to UB if you do this
0 голосов
/ 19 февраля 2020

Если вы настаиваете на этом, по крайней мере, закройте уродство в операторе, чтобы остальная часть кода была написана, по крайней мере, достаточно аккуратно:

#include <iostream>
using namespace std;
enum num
{
    NUM_ZERO = 0,
    NUM_ONE = 1,
    NUM_TWO = 2,
    NUM_THREE = 4
};

num &operator|=(num &a, num const &b) {
    a = static_cast<num>(a | b);
    return a;
}

int main()
{
    num numFlag;
    numFlag |= NUM_TWO;
}

Но имейте в виду, что это будет позвольте вам генерировать значения, которых нет в вашем перечислении. Например, последовательность типа:

num a{NUM_ZERO};
a |= NUM_TWO;
a |= NUM_THREE;

... дает a значение, которого нет в перечислении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...