【发布时间】:2013-10-13 01:33:29
【问题描述】:
我在将方法 args 放入我的班级时遇到问题:
class A {
public:
enum Mode {ModeA, ModeB, ModeC};
... // other methods, constructor etc
void setMode(Mode m) {
mMode = m;
}
private:
Mode mMode;
}
int main(int argc, char **argv) {
A a;
a.setMode(A::ModeA | A::ModeC );
return 0;
}
问题,我得到一个 C++ 编译器错误invalid vconversion from int to A::Mode,
我不明白,为什么我不能连接到枚举值?我需要在我的
代码,所以任何解决这个问题的帮助都会非常好。
【问题讨论】:
-
C++ 中的枚举不应该被连接,因为结果不再是枚举类型。
-
@Ashalynd 我同意,所有的答案似乎都忽略了这个操作实际上会导致信息丢失的观点。如果
ModeA==0(默认情况下应该如此),则无法区分ModeC和ModeA | ModeC。我不建议使用枚举来存储标志。您可以手动列出枚举中的各个标志名称(手动分配 0x1、0x2、0x4、0x8 等),但存储组合应在位域、基础类型或类似内容中完成。 -
C++ 中的枚举支持(我敢说明确地支持)位标志,参见this question
-
@DyP 仅当枚举值手动设置为不冲突时。我只是认为有一个
Mode类型的成员可能实际上具有不等于任何单个枚举值的值,但我认为您的观点是标准实际上并没有区分在基础类型或枚举类型。得分。 -
@PeterT 我同意
enum并不完美,但范围枚举比std::bitset或底层类型更安全。 (更好的解决方案可能是将std::bitset包装在不透明的 typedef 中,但这也需要更多的工作。)