Borland C ++ Typecast覆盖 - 为何歧义?

时间:2013-08-09 12:23:38

标签: c++ casting c++builder

我有以下枚举定义:

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);

它会编译,但在这种情况下,我将不得不重新审视整个巨型项目并“纠正”每个类的使用 - 这不是一个好主意,因为这是我们的“错误变量”,它是过度使用。

进行编译必须有更优雅的方式。有人有想法吗?

3 个答案:

答案 0 :(得分:4)

Borland的编译器在这里显然是错误的。因此,无论你做什么都必须成为编译器错误的解决方法,这会让它变得烦人,因为没有好的“这是你应该做的优雅的事情”解决方案:优雅的东西是你正在做的事情,它触发了错误。很少有一个优雅的解决方案可以解决问题。

因此,首先要做的是提交错误报告。

然后,您可以考虑一件事:除了比较之外,您是否需要转换为枚举?如果不是(或者如果这种情况很少见),请考虑重载MyClass和MyEnum之间的比较。

答案 1 :(得分:1)

避免使用转换运算符和非(!)显式构造函数采用相同的类型!显式MyClass(MyEnum initvalue)enum1(initvalue){}应该修复它。

答案 2 :(得分:0)

代表tebe回答:
由于我不能发表对我更清楚的结论性答案,我在这里发表我的想法:

解决方案是为MyEnum和MyClass参数重载全局operator ==