4

次のようなプログラムがあります。

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

4

1 に答える 1