我有以下枚举定义:
typedef enum MyEnumBase
{
VALUE0 = 0,
VALUE1,
VALUE2,
VALUE3
} MyEnum;
我的课程以下列方式使用此枚举:
class MyClass {
public:
MyClass (MyEnum initvalue) {enum1 = initvalue;};
operator bool() {return (VALUE0 == enum1);};
operator MyEnum() {return (enum1);};
private:
MyEnum enum1;
};
使用主要功能:
int main(int agrc, char *argv[])
{
MyClass class1 = VALUE2;
bool OK = (VALUE0 == class1);
return 0;
}
它可以很好地编译MS VC ++ 2010,但Borland XE2和XE3告诉我以下内容:
[bcc32 Error] test.cpp(26): E2015 Ambiguity between 'operator MyClass::bool()' and 'operator MyClass::MyEnumBase()'
我想这可能是不明确的 - 但另一方面,左侧的参数是MyEnum类型,它是直接进行枚举,而不是类的布尔强制转换。 (正如Visual Studio所做的那样)
如果我交换参数(class1 == VALUE0),问题仍然存在。
可以将该行修改为:
bool OK = (VALUE0 == (MyEnum)class1);
它会编译,但在这种情况下,我将不得不重新审视整个巨型项目并“纠正”每个类的使用 - 这不是一个好主意,因为这是我们的“错误变量”,它是过度使用。
进行编译必须有更优雅的方式。有人有想法吗?
答案 0 :(得分:4)
Borland的编译器在这里显然是错误的。因此,无论你做什么都必须成为编译器错误的解决方法,这会让它变得烦人,因为没有好的“这是你应该做的优雅的事情”解决方案:优雅的东西是你正在做的事情,它触发了错误。很少有一个优雅的解决方案可以解决问题。
因此,首先要做的是提交错误报告。
然后,您可以考虑一件事:除了比较之外,您是否需要转换为枚举?如果不是(或者如果这种情况很少见),请考虑重载MyClass和MyEnum之间的比较。
答案 1 :(得分:1)
避免使用转换运算符和非(!)显式构造函数采用相同的类型!显式MyClass(MyEnum initvalue)enum1(initvalue){}应该修复它。
答案 2 :(得分:0)
代表tebe回答:
由于我不能发表对我更清楚的结论性答案,我在这里发表我的想法:
解决方案是为MyEnum和MyClass参数重载全局operator ==
。