2012-05-05 111 views
0

我以爲我們可以調用沒有模板參數的模板函數。 爲什麼只有當我將模板參數指定爲double時,此代碼才能工作?模板參數推導與模板參數

#include <iostream> 
template <typename T> 
T max(T x, T y) 
{ 
    return x > y ? x : y; 
} 

int main() 
{ 
    cout<<::max(3,4.7)<<"\n";  //Error 
    cout<<::max<int>(3,4.7)<<"\n"; //Error 
    cout<<::max<double>(3,4.7)<<"\n"; //Works 
} 
+0

第二個確實編譯 - http://ideone.com/dGQdF –

+0

http://codepad.org/l6rByNk1 – cppcoder

+1

這是一個警告,雖然被視爲錯誤。 –

回答

3

模板參數推導需要被應用到所有參數的功能,並且在第一種情況下(僅適用於不編譯的情況下),它會推斷論據是intdouble。因爲他們不匹配剛好,參數扣除失敗。正如你已經意識到的答案是禁用類型演繹並自己提供類型參數(第二行和第三行)。

對於明確的專用函數模板和普通函數,參數將受到隱式或用戶定義的類型轉換(double爲int,int爲double或通過類構造函數和轉換運算符)。但是,在模板參數推導過程中,不會執行這種類型的轉換。