Borland C++Typecast重写-为什么歧义
Borland C++ Typecast overrides - Why Ambiguity?
我有以下枚举定义:
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 ==
。
相关文章:
- 为什么下面带有非常量转换函数的代码没有歧义?
- 为什么在重载区域函数时在波纹管代码的情况下会出现歧义
- 在C 中,静态成员函数是否继承了?如果是,为什么没有出现歧义错误
- 为什么在具有相同签名的模板化和非模板化函数之间进行选择时没有歧义?
- 为什么any_cast函数重载不会导致歧义?
- 为什么这种ADL解决方案歧义
- 为什么我总是必须除以 49 才能得到二进制转换器 + cout 歧义的正确答案?
- 为什么在这个函数调用中没有歧义
- 为什么在Mac OS X上使用size_t时uint32_t和uint64_t之间存在歧义
- 了解'most vexing parse' - 为什么允许歧义语法?
- 为什么编译器在这里抱怨函数歧义
- 为什么私有继承不能解决静态函数的歧义?(在 MSVC 中测试)
- Borland C++Typecast重写-为什么歧义
- 采用可选且无参数的重载方法:为什么没有歧义
- 为什么下面的表达式 'd.f(1);' 在 main() 中没有歧义?
- 为什么 B::f 不能解决歧义,而 A::f 可以解决?
- 为什么函数有歧义
- 如何解决 boost::signals2 的slot_type和 boost::bind 的歧义,为什么它甚至模棱两可?
- 为什么这两个构造函数一起不会产生歧义错误?
- 为什么我不能使用 using 来消除基本成员变量之间的歧义?