2017-06-29 65 views
0

我正在用C++模板測試下面的代碼。我寫了一個使用int和float並使用函數模板的方形函數。模板功能 - 模板是否覆蓋正常功能

#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 

雖然我預計

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

有人能解釋的區別?

+0

在第三個輸出中,如果編譯器有兩個選擇,則比模板函數更好的正常功能.http://en.cppreference.com/w/cpp/language/overload_resolution –

回答

4

模板沒有 「越權」 常規功能。恰恰相反,如果正則函數匹配調用中指定的參數類型,通常會「贏」重載解析過程。所以,實際上是相反的:所有其他的東西都是平等的,正則函數「覆蓋」模板函數。

在您的情況下,前兩個調用將轉到模板,因爲您在調用中使用了<>明確請求了模板。您明確禁止編譯器使用常規函數。

第三次調用進入常規函數,因爲它是完全匹配的,因此它「勝利」,如上所述。

由於現有的常規函數​​不完全匹配(float參數與double參數),第四次調用轉到模板版本,而模板可用於生成完全匹配。

5

它不覆蓋任何東西,這是一個更好的匹配。這是因爲5.5double類型的常量,而不是float類型的常量。

你沒有任何雙重過載,所以模板被實例化。這是因爲模板不需要從double到float的轉換序列,而不需要重載。

如果使用float不變,就像這樣:

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

它將打印

float function