2013-04-01 103 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