我有一个程序,看起来像这样:
class B {};
class A
{
template<typename T> int operator+(const T&) const { return 1; } // Function 1
};
template<typename T, typename P> int operator+(const T&, const P&) { return 2; } // Function 2
int main()
{
A a;
B b;
std::cout<<(a + b);
return 0;
}
在这种情况下,将调用函数2。但是当我将函数1修改为自由函数而不是成员函数时
template<typename T> int operator+(const A&, const T&) { return 1; } // Function 1
template<typename T, typename P> int operator+(const T&, const P&) { return 2; } // Function 2
现在将调用函数1,尽管在这两种情况下函数1基本相同。这背后的原因是什么?GCC根据ISO C++标准抱怨歧义,但没有说明确切的原因,并且编译得很好。这种情况对于运算符来说是唯一的,因为无论它们是否为成员,都可以以相同的方式调用它们。
现在将调用函数1,尽管在这两种情况下函数1基本相同。这背后的原因是什么?
对重载的函数模板执行部分排序,以在此处选择最佳匹配。
非正式地"A比B更专业;是指";A接受的类型少于B";。
函数1比函数2更专业,因为它接受的类型更少;它只能接受A
作为它的第一个操作数,而函数2可以接受任何类型。
出于同样的原因,在第一种情况下,也应该选择成员功能1;就像叮当一样。这似乎是gcc的错误,请参阅错误53499和错误66914。