5

さて、ここにプログラムがあり、完全に正しく機能します

#include <iostream>

using namespace std;

template <typename T>
void Swap(T &a , T &b);

int main(){

    int i = 10;
    int j = 20;

    cout<<"i, j = " << i <<" , " <<j<<endl;
    Swap(i,j);
    cout<<"i, j = " << i <<" , " <<j<<endl;


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

しかし、関数の名前をSwapからswapに変更すると、次 のようなエラーが発生します。

エラー:オーバーロードされた'swap(int&、int&)'の呼び出しがあいまいです| 注:候補は次のとおりです。voidswap(T&、T&)[with T = int] | || ===ビルドが完了しました:1エラー、0警告=== |

テンプレートを使用して大文字で始まる関数を開始するのはどうしたのですか?

4

1 に答える 1

11

これは、という関数がすでに存在するためswapです。実際にはstd名前空間の下にありますが、行があるため、プレフィックスusing namespace stdなしで存在します。std::

ご覧のとおりusing namespace std、この例のように、名前の衝突が発生する可能性があるため、を使用することが常に適切なオプションであるとは限りません。一般usingに、名前の衝突を防ぐために、これに本当の理由がない限り(名前空間が理由で存在する)、ディレクティブを使用しないことをお勧めします。

于 2012-11-10T16:07:09.500 に答える