0

このコードをコンパイルすると、次のエラーが表示されます

オーバーロードの呼び出しswap(int&, int&)があいまいです

しかし、ここでは swap 関数を 1 つだけ書きました。

関数があいまいな理由と、プログラムを正しく実行するために必要な変更を教えてください。

using namespace std;

template <class T>
void swap(T& x, T& y)
{
    T temp;
    temp = x;
    x = y;
    y = temp;
}

int main()
{
    int a, b;

    cout << "Enter two elements: ";

    cin >> a;
    cin >> b;

    swap(a, b);
    cout << "a is "<<a << '\t'<<"b is " << b << std::endl;

    return 0;
}

スワップ関数しかないのに、スワップ関数がオーバーロードされたのはなぜですか?

4

2 に答える 2

3

使用する必要があります

 ::swap(a,b); //use one in global namespace, which is the one you defined

定義したものを呼び出したい場合。stdは関数テンプレートも定義しているので、使用しない場合swapはコンパイラが検索します。std namespace::

より具体的には、パラメータaおよびは で定義されているbタイプであり、コンパイラが を検索すると、 で定義されたバージョンと で定義されたバージョンの両方が検出されます。どちらを明示的に使用する必要があるかをコンパイラに伝える必要があります。そうしないと、あいまいさが生じます。intstd namespaceswapstd namespaceglobal namespace

于 2013-04-20T02:32:06.980 に答える
2

「using namespace std;」があり、おそらく「アルゴリズム」が含まれているため、std::swap を可視化できます。これにより、コンパイラが警告しているあいまいさが得られます。

解決策は、「using namespace std;」を追加しないか、「::swap(a, b)」として呼び出して、名前のない名前空間で明示的に独自の関数を呼び出すことです。

于 2013-04-20T02:39:26.757 に答える