0

我有以下枚举定义:

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

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

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

4

3 回答 3

4

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

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

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

于 2013-08-09T12:28:41.310 回答
1

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

于 2013-08-09T12:53:15.507 回答
0

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

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

于 2014-05-16T13:41:18.597 回答