C++ 关于成员和自由算子的消歧规则
我有一个类似这样的程序:C++ 关于成员和自由算子的消歧规则,c++,templates,overload-resolution,partial-ordering,C++,Templates,Overload Resolution,Partial Ordering,我有一个类似这样的程序: 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 ma
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;
}
B类{};
甲级
{
模板int运算符+(常量T&)常量{return 1;}//函数1
};
模板int运算符+(常量T&,常量P&){return 2;}//函数2
int main()
{
A A;
B B;
标准::cout
现在将调用函数1,尽管在这两种情况下函数1基本相同。这背后的原因是什么
在此处执行以选择最佳匹配
非正式地说,“A比B更专业”意味着“A接受的类型比B少”
函数1比函数2更专业化,因为它接受的类型更少;它只能接受A
作为其第一个操作数,而函数2可以接受任何类型
出于同样的原因,在第1个场景中,成员函数1也应该被选择;同样如此。这似乎是gcc的错误,请参阅和。这也是我的想法,但当函数1是成员函数时,gcc选择函数2。根据参考,不应该像gcc所说的那样模棱两可,应该选择函数1但我想这只是一个编译器错误。@mr不过我想是的。答案修改了。
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