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;;
}

问题是什么:

我期待调用非模板函数的 sum() 。但是在我的输出模板中调用了初始化函数。它不是函数模板重载的一部分吗?

请指出我在这里犯了什么错误?

4

3 回答 3

4

我期待调用非模板函数的 sum() 。

您正在传递右值,它不能绑定到非常量引用。因此选择了模板版本。

更改int &int const &OR int,将选择第一个版本:

希望有帮助。

于 2013-04-01T05:20:28.073 回答
3

问题是int&不能绑定到临时的,所以不能使用非模板版本。这与int& i = 10;不允许的行为相同。

10并且20是纯右值(3.10):

prvalue(“纯”右值)是不是 xvalue 的右值。[ 示例:调用返回类型不是引用的函数的结果是纯右值。诸如 12、7.3e5 或 true 之类的文字的值也是纯右值。—结束示例]

于 2013-04-01T05:20:28.347 回答
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

于 2013-04-01T05:22:41.047 回答