【发布时间】:2011-07-31 06:41:41
【问题描述】:
我有一个包含枚举的类,以便于打印、序列化等。
我希望能够在 switch 语句中使用它作为传统的枚举,因此在 gcc-4.3 之前我一直使用 int() 重载器。但是,我的代码现在因 gcc-4.5.1 而中断。
enum E { consta, constb };
class Wrap {
private:
E e;
public:
operator E() { return e;}
operator E() const { return e;}
operator int() const { return e;}
Wrap(E a) : e(a) { }
};
int main() {
Wrap x(constb);
x = consta;
switch (x) { /* Error here */
case consta: // ..
case constb: // ..
}
return 0;
}
编译器错误是:
错误:来自“Wrap”的模棱两可的默认类型转换
错误:候选转换包括 'Wrap::operator E() const' 和 'Wrap::operator int() const'
这是库的一部分,我希望代码适用于所有版本,因此删除 int 重载器不是一种选择。
【问题讨论】:
-
为什么需要非常量
operator E()?