2013-04-01 104 views
1

請考慮以下程序。函數模板重載

#include <iostream> 
using namespace std; 

int sum (int & a, int & b) 
{ 
    cout <<" NOn template function "<<endl; 
    return a+b; 
} 

template <typename T> 
int sum (const T & a, const T & b) 
{ 
    cout<<"Template Generated .."<<endl; 
    return a+b; 
}; 


int main(int argc, char ** argv) 
{ 
    cout <<sum(10,20)<<endl;; 
} 

是什麼問題:

我期待非模板函數的總和()被調用。但在我的輸出 模板初始化函數被調用。它不是函數模板重載的一部分嗎?

請問我在這裏做什麼錯誤?

回答

3

問題是int&無法綁定到臨時,因此無法使用非模板版本。這與int& i = 10;相同,這是不允許的。

1020是prvalues(3.10):

甲prvalue(「純」右值)是一個rvalue這不是一個x值。 [ 示例:調用返回類型不是 引用的函數的結果是一個prvalue。 真值的文字如12,7.3e5或 也是一個值。末端示例]

+0

優秀的答案。 ;)謝謝傑西。 – Whoami

4

我在期待非模板函數sum()被調用。

您傳遞的rvalues不能綁定到非const引用。因此選擇了模板版本。

變化int &int const & OR int,第一個版本將被選中:

希望有所幫助。

+1

由於納瓦茲,我期待的響應)。 – Whoami

0
template <typename T> 
T sum (const T & a, const T & b) 
{ 
    cout<<"Template Generated .."<<endl; 
    return a+b; 
}; 

Ťsum (const T & a, const T & b)變化intT