错误:从"int"到枚举c++的转换无效

error: invalid conversion from ‘int’ to enum c++

本文关键字:quot c++ 无效 转换 枚举 int 错误      更新时间:2023-10-16

当我用c++编译下面的示例代码时,我得到了"错误:从'int'到'num'的无效转换"。用枚举名称对其进行类型转换没有帮助。

#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;
}

如果有人知道如何解决这个问题,请告诉我。

从语法上讲,

*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;
}

如果你坚持这样做,至少要用一个运算符来弥补不足,这样剩下的代码就可以写得至少相当干净:

#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一个不在枚举中的值。

根据您正在执行的变量和操作的名称,如果您需要指针,则numFlag的类型应为intint *。否则,如果你试图在该变量/内存中保留多个标志,你可能会有未定义的行为(根据你假设的标志值(:

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