错误:“operator==”的重载不明确
error: ambiguous overload for ‘operator==’
我试图理解为什么我的c++编译器与以下代码混淆:
struct Enum
{
enum Type
{
T1,
T2
};
Enum( Type t ):t_(t){}
operator Type () const { return t_; }
private:
Type t_;
// prevent automatic conversion for any other built-in types such as bool, int, etc
template<typename T> operator T () const;
};
enum Type2
{
T1,
T2
};
int main()
{
bool b;
Type2 e1 = T1;
Type2 e2 = T2;
b = e1 == e2;
Enum t1 = Enum::T1;
Enum t2 = Enum::T2;
b = t1 == t2;
return 0;
}
编译导致:
$ c++ enum.cxx
enum.cxx: In function ‘int main()’:
enum.cxx:30:10: error: ambiguous overload for ‘operator==’ (operand types are ‘Enum’ and ‘Enum’)
b = t1 == t2;
^
enum.cxx:30:10: note: candidates are:
enum.cxx:30:10: note: operator==(Enum::Type, Enum::Type) <built-in>
enum.cxx:30:10: note: operator==(int, int) <built-in>
我知道我可以通过提供明确的operator==
:来解决症状
bool operator==(Enum const &rhs) { return t_ == rhs.t_; }
但我真正想要的是解释为什么只有在class
中比较enum
才会导致歧义。我写了这个小的枚举包装器,因为我被要求在代码中只使用C++03。
调用不明确,因为Enum::Type
和int
版本都通过一个隐式转换有效,前者使用operator Type
转换,后者使用operator T
模板转换运算符。
目前尚不清楚为什么要转换为任何类型,但如果删除该运算符,代码就会工作。
如果您使用的是C++11,那么应该使用作用域枚举。
Enum
是实现定义的积分类型,主要是int
。现在,无论您为enum
实现什么运算符,都与您为类型int
实现运算符一样。并重新定义了int
、double
、char
等积分类型的任意算子。。。是不允许的,因为这将改变编程语言本身的基本含义。
enum
可以隐式转换为int
(据我所知,这是由于与C
的向后兼容性造成的。如果可以使用C++11
,则可以使用enum class
来解决此问题,因为作用域枚举不允许隐式转换到int
。
相关文章:
- 重载类方法的不明确调用
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 对重载函数find_first_not_of的不明确调用
- 使用 nullptr 调用重载方法是不明确的
- "fpclassify":对重载函数的不明确调用
- 在类Bat代码中,这给了我错误:重载的"Bat()"的调用是不明确的Bat(;)
- 错误:使用复制和交换习惯用法的交换函数中"operator="的重载不明确
- C++ 函数重载不明确,没有自动类型转换
- 提升错误:"运算符=="的重载不明确
- Clang 中的运算符重载不明确
- SFINAE:如果在没有参数的情况下调用,则重载不明确
- 矩阵添加:“operator+”的重载不明确
- 错误:'operator<<'的重载不明确
- gsl::span<T> 和 gsl::span<const T> 重载不明确
- C++ 函数重载不明确
- 错误:“operator==”的重载不明确
- 错误:在C++中使用模板时,"运算符<<"的重载不明确
- 错误:Map<int 中运算符 = 的重载不明确,std::basic_string >::<char>Elem::t3 = 0
- C++编译错误,运算符重载不明确