2012-11-10 2 views
5

よしそうHERESにプログラムとは関数の名前を `swap`とするとテンプレートエラーになるのですが、` Swap`は大丈夫ですか?

#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; 
} 

絶対的に正しい動作しますが、私はスワップスワップから、関数の名前を変更したときそれは

error: call of overloaded 'swap(int&, int&)' is ambiguous| note: candidates are: void swap(T&, T&) [with T = int]| ||=== Build finished: 1 errors, 0 warnings ===|

を言って、エラーが発生し 大文字で始まるテンプレートを使って関数を始めるのはどういうことでしょうか?

+0

テンプレート化された関数名は大文字で始めるべきですか?私は知らないので頼んでいる、私は同意しないからではない。しかし、例えば標準ライブラリではlower_caseという命名規則も使用されています。そのため、このような命名規則には大きな利点がありません。 :) – zxcdw

答えて

10

swapという名前の関数が既に存在するためです。実際にはstd名前空間の下にありますが、using namespace std行があるため、接頭辞はstd::ではありません。

ご覧のとおり、using namespace stdの使用は、この例のように、名前の衝突が発生する可能性があるため、必ずしも適切な選択肢とは限りません。一般的に、usingディレクティブを使用したくないのは、名前空間が存在する理由が存在しない場合(名前空間が存在するため)、名前の衝突を防ぐためです。

+0

おっと!私の愚かな。ありがとう –

+0

私はちょうどLOL'd ... –