次のようなプログラムがあります。
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++ 標準に従ってあいまいさについて不平を言っていますが、正確な原因を述べておらず、とにかく正常にコンパイルされます。このケースは、メンバーであるかどうかに関係なく同じ方法で呼び出すことができるため、オペレーターに固有です。