我把方法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
,
我不明白,为什么我不能连接到枚举值?我需要在我的内容中连接值
代码,所以解决这个问题的任何帮助都会非常好。
答案 0 :(得分:11)
默认情况下,两个枚举的operator|
结果不是枚举。课后,添加如下内容:
A::Mode operator|( A::Mode a, A::Mode b )
{
return A::Mode( int( a ) | int( b ) );
}
如果您的标准库支持它,以下是更具前瞻性的证据,因为转换为int
并不总是正确的:
A::Mode operator|( A::Mode a, A::Mode b )
{
typedef std::underlying_type< A::Mode >::type UL;
return A::Mode( static_cast< UL >( a ) | static_cast< UL >( b ) );
}
与其他答案不同,您只需添加一次(到正确的位置)即可自动覆盖所有用途。
答案 1 :(得分:2)
可能你需要这个:
a.setMode( (A::Mode) (A::ModeA | A::ModeC ));
A::ModeA | A::ModeC
生成int
,然后再将其投放到A::Mode
答案 2 :(得分:1)
enum
的基础类型在这种情况下可能是int
,并且您的编译器不能依赖使用|
构造的标志(按位或)作为此枚举的有效值
但是,您知道结果将是此枚举中的有效值,因此您可以执行以下操作:
A::Mode newMode = (A::Mode) (A::ModeA | A::ModeC);
a.setMode(newMode);