2012-12-04 38 views
2

我開始閱讀有關模板和我困惑的下面。顯式模板參數規範

template<class T> 
T max(T t1, T t2) 
{ 
    if (t1 > t2) 
     return t1; 
    return t2; 
} 

int main(){ 
    std::cout<<max<int>(120,14.55); 
    return 0; 
} 

輸出爲120。但是,當我編譯上面我得到這樣的警告:

warning:passing double for argument 2 to T max(T, T) [with T = int]. 

我的問題是,爲什麼這樣的警告來了,因爲我已經實例化T max(int t1,double t2)

因爲根據我的理解,如果我明確提到只有一種數據類型(這裏是int),其他的會被編譯器從參數類型(14.55)中扣除。這意味着T max(T t1, T t2)在這種情況下,實例化T max(int t1,double t2)。我從互聯網上某些模板的文檔閱讀這一概念。

請清除我的疑惑,否則我無法進一步處理。

+2

你需要閱讀更多有關模板。 'template '中的'T'是用於_both_參數的類型,並且您在調用中明確將其設置爲'int'。 –

+0

是Joachim.even這是我的理解,但我讀了http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1上述概念。你能告訴我,我明白的是錯的還是不是? –

回答

1
std::cout << max<int>(120,14.55); 

這條線被equavivalent使用功能 INT MAX(INT,INT)的,所以編譯器給出了從14.55至14的警告轉換 - 可能的數據丟失。

如果要比較不同勢類型的數據,你應該在main.cpp中使用

template<class T, class T1, class T2> 
T max(T1 t1, T2 t2) 
{ 
    if (t1 > t2) 
     return T(t1); 
    return T(t2); 
} 

後:

float a = max<float, int, double>(10, 11.0); 

,但它不這樣做的最佳方式。

+0

如果是這種情況,那麼如果我嘗試與最大(120,14.55);再次,我應該只得到警告。但我得到編譯時錯誤.Below是錯誤>錯誤:沒有匹配函數調用max(int,double)。 –

2

您的特定模板只有一個模板參數T。這意味着,max<int>創建此:

int max(int t1, int t2) 

沒有辦法產生max(int, double)出這個模板。如果你想混合類型參數,模板必須是這樣的:

template <typename T1, typename T2> 
/*some return type*/ max(T1 t1, T2 t2) 

然而,現在它不容易確定返回類型應該是什麼,以及type_traits很可能會需要得到一個正確的返回鍵入這樣的功能。

+1

有關返回類型,請參見['std :: common_type'](http://en.cppreference.com/w/cpp/types/common_type)。 –

0

why this warning came is my question since i have already instantiated for T max(int t1,double t2) .

不,你沒有。提供int作爲模板參數與int替換參數出現的所有實例的模板:

T max(T t1, T t2) becomes int max(int t1, int t2) 

Because as per my understanding here if i explicitly mention only one data type (here int), other would be deducted from the argument type

號你的模板只有一個參數,用於兩個函數參數類型;所以,如果你指定的參數,那麼它同時用於(和返回類型也一樣)。如果您希望這些單獨parametrised,那麼你就需要爲每個單獨的參數。

template <typename T1, typename T2> 
???? max(T1 t1, T2 t2) 

如何最好地指定返回類型留作練習。

現在,如果你只提供第一個參數,第二個是從第二個函數參數推導出:

max<int>(120,14.55); // T1=int given, T2=double deduced -> max(int,double) 
max(120,14.55)  // T1=int, T2=double both deduced -> max(int,double) 
+0

邁克感謝您的快速回復我的疑問也正是在這部分你所說的最大(120,14.55); //「int」給出,「double」推導出來 - >這意味着T max(T t1,T t2)應該變成int max(int t1,double t2)。那麼爲什麼我們推導出double? –

+0

你能否說清楚這一點?你說的是我的確切疑問? –

+0

@SubiSuresh:你的模板只有一個參數'T'。如果你指定它應該是'int',那麼它將在任何地方都是'int' * - 特別是函數聲明將是'int max(int,int)'。我的示例模板有兩個參數,'T1'和'T2',可以單獨指定;指定第一個沒有指定第二個,可以自由地推導出來。 –