Borland C++Typecast重写-为什么歧义

Borland C++ Typecast overrides - Why Ambiguity?

本文关键字:为什么 歧义 重写 C++Typecast Borland      更新时间:2023-10-16

我有以下枚举定义:

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()'

我想它可能是ambigus,但另一方面,左侧参数的类型是MyEnum,并且直接进行枚举类型转换,而不是类的布尔类型转换。(和Visual Studio一样)

如果我交换参数(class1==VALUE0),问题仍然存在。

可以将行修改为:

bool OK = (VALUE0 == (MyEnum)class1);

它会编译,但在这种情况下,我必须检查整个庞大的项目,并"纠正"类的每一次使用——这不是一个好主意,因为这是我们的"错误变量",它被过度使用了。

必须有一种更优雅的方式进行编译。有人有主意吗?

Borland的编译器在这里显然是错误的。因此,无论你做什么,都必须是解决编译器错误的方法,这会让它很烦人,因为没有好的"这是你应该做的优雅的事情"解决方案:优雅的事情就是你目前正在做的事情,它会触发错误。很少有一个问题有不止一个优雅的解决方案。

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

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

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

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

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