以下代码:
void f3()
{
enum AeF3
{
f3E1 = 1,
f3E2,
f3E3,
};
struct AsF3
{
AeF3 e1:2, e2:2, e3:2;
};
AsF3 inst;
inst.e1 = f3E1;
inst.e2 = f3E2;
inst.e3 = f3E3;
cout << "inst.e1 is " << ((inst.e1 == f3E1) ? "" : "not ") << "equal to f3E1" << endl;
cout << "inst.e2 is " << ((inst.e2 == f3E2) ? "" : "not ") << "equal to f3E2" << endl;
cout << "inst.e3 is " << ((inst.e3 == f3E3) ? "" : "not ") << "equal to f3E3" << endl;
}
生成以下输出:
inst.e1 is equal to f3E1
inst.e2 is not equal to f3E2
inst.e3 is not equal to f3E3
如何在没有演员的情况下修复此错误?
e2&amp; e3不能保存大于1的值,因为它们必须为其符号保存一位。我需要一种方法告诉编译器不要使用此位进行符号,而是将其用于代替值。 我试过了:
enum AeF3 : byte
但它没有帮助。而不是-2,254被比较,而2不等于-2也不是254。
答案 0 :(得分:2)
整个方法都错了。 C ++ 03中的枚举类型(以及C ++ 11中的语法)未指定,并且创建具有基础枚举类型(或一般的有符号类型)的位域不是正确的方法。你应该这样做:
struct AsF3 {
unsigned int e1 : 2;
unsigned int e2 : 2;
unsigned int e3 : 2;
};
请注意,无论您使用AeF3
还是unsigned int
,所有成员{{1 },e1
,e2
将是整数类型(而不是枚举)