2010-08-28 82 views
1

在下面的程序,爲什麼編譯器生成的調用printMax模板函數,而不是調用printMaxInts功能的錯誤?爲什麼編譯器不能將此調用解析爲模板函數?

#include <iostream> 

template<class A> 
void printMax(A a,A b) 
{ 
    A c = a>b?a:b; 

    std::cout<<c; 
} 

void printMaxInts(int a ,int b) 
{ 
    int c = a>b?a:b; 

    std::cout<<c; 

} 

int main() 
{ 
    printMax(1,14.45); 

    printMaxInts(1,24); 
} 

回答

6

爲了讓編譯器從傳遞給函數模板參數推斷出模板參數A,這兩個參數,ab必須具有相同的類型。

您的參數類型爲intdouble,因此編譯器無法推斷出它應該實際用於A的類型。應該Aint還是應該是double

printMax(1.0, 14.45); 

或通過顯式指定模板參數:

printMax<double>(1, 14.45); 

的原因,調用非模板函數

您可以通過這兩個參數具有相同類型的解決這個問題可以稱得上是編譯器不需要推導出參數的類型:它知道參數的類型,因爲你說的話,他們在函數聲明:

void printMaxInts(int a, int b) 

ab都是int類型。當你經過一個double作爲參數傳遞給該功能,double -> int標準轉換的參數執行,並且調用該函數時用所得int

+3

另一個解決方法是取兩個模板參數,在函數中執行轉換。 – Potatoswatter 2010-08-28 19:00:01

1

以下代碼建立在James的答案上。你會發現,我已經取出的條件表達式:我已經這樣做了,因爲結果子句該表達式必須具有相同的類型,規定了A和B

上唯一的要求附加限制A和B在這個版本的代碼的是,有操作者<(),其相關的它們(或一個可轉化爲其他的),以及必要的操作者< <()函數存在。

template<typename A, typename B> 
void printMax(A a, B b) 
{  
    if (a < b) 
    { 
     cout << b; 
    } 
    else 
    { 
     cout << a; 
    } 
} 
相關問題