2

テンプレートについて学び始め、本からコードをコピーしましたが、コンパイラーからこのエラーが発生します

エラー1エラー:'スワップ':オーバーロードされた関数へのあいまいな呼び出し "

これが私のプログラムです

#include <iostream>

template <typename X>
void swap(X &a, X &b);

int _tmain(){
    using namespace std;
    int a, b;

    cout << "enter two numbers:\n";
    cin >> a >> b;
    cout << "Your numbers are: " << a << ", " << b << endl;

    swap(a, b); //error is here
    cout << "Your numbers reversed are: " << a << ", " << b << endl;

    return 0;
}

template <typename X>
void swap(X &a, X &b){
    X temp = a;
    a = b;
    b = temp;
}
4

1 に答える 1

4

同じシグニチャを使用して関数スワップを再定義しているため、定義があいまいになり、その結果、呼び出しがあいまいになります。

同じシグニチャで関数を維持したい場合は、swap()定義をシャドウイングしない「usingnamespace std;」を使用しないか、単に別の名前空間で関数を定義するかを選択する必要があります。

例:

namespace your_namespace {

    template <typename X>
    void swap(X &a, X &b) {
        X temp = a;
        a = b;
        b = temp;
    }

}

int foo(10), bar(20);
std::cout << "foo: " << foo << "; bar: " << bar << std::endl;

your_namespace::swap(foo, bar);
std::cout << "foo: " << foo << "; bar: " << bar << std::endl;

出力:

foo: 10; bar: 20
foo: 20; bar: 10

よろしく!

于 2012-11-18T12:33:44.610 に答える