Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于成员和自由算子的消歧规则_C++_Templates_Overload Resolution_Partial Ordering - Fatal编程技术网

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