2017-06-29 18 views
0

次のコードをC++テンプレートでテストしています。私は関数intとfloatと関数テンプレートを使って二乗関数を書いています。私はテンプレート関数 - テンプレートが通常の関数をオーバーライドしますか

template function 
25 
template function 
30.25 
template function 
25 
template function 
30.25 

を期待しても

#include <iostream> 
using namespace std; 

int square (int a){ 
cout << "int function" << endl; 
return a*a; 
}; 

float square (float a){ 
cout << "float function" << endl; 
return a*a; 
}; 

template <typename T> 
T square (T x){ 
cout << "template function" << endl; 
return x*x; 
} 

int main(){ 
cout << square<int>(5) << endl; 
cout << square<float>(5.5) << endl; 
cout << square(5) << endl; 
cout << square(5.5) << endl; 
return 0; 
} 

出力は

template function 
25 
template function 
30.25 
int function 
25 
template function 
30.25 

で誰かが違いを説明できますか?

+0

3番目の出力で、コンパイラに2つの選択肢がある場合は、テンプレート関数よりも正常です.http://en.cppreference.com/w/cpp/language/overload_resolution –

答えて

4

テンプレートを印刷します。まったく逆の通常の関数は、呼び出しで指定された引数の型と一致する場合、通常、オーバーロード解決プロセスに「勝利」します。だから、それは実際には逆です:他のすべてのものは等しく、通常の関数はテンプレート関数を "上書き"します。

場合によっては、電話で<>を使用してテンプレートを明示的に要求したため、最初の2回の呼び出しがテンプレートに移動します。コンパイラが正規の関数を使用することは明示的に禁止されています。

3番目の呼び出しは正規表現になります。これは正確に一致しているため、上記のように "勝利"します。

既存の正規関数が完全一致ではないため(floatパラメータ対double引数)、テンプレートを使用して完全一致を生成できるため、4番目の呼び出しはテンプレートバージョンに移動します。

5

これは何も上書きしません。より良い一致です。これは、5.5がタイプdoubleの定数であり、タイプがfloatではないためです。

テンプレートがインスタンス化されるように、倍精度のオーバーロードはありません。これは、テンプレートがオーバーロードとは対照的に、倍精度から浮動小数点への変換シーケンスを必要としないためです。あなたはそのようなfloat定数を、使用している場合

cout << square(5.5f) << endl; 

これは、通常の関数を "上書き" しません

float function 
関連する問題