关于“template”跟“引用”
关于“template”和“引用”
我的代码如下:(平台是VS2005,系统XP)
#include <iostream>
using std::cout;
using std::endl;
double _min( double& a, double& b ) {
cout << "call " << "double min" << endl;
return a < b ? a : b;
}
template <typename T>
T _min( const T& a, const T& b ) {
cout << "call " << "template min" << endl;
return a < b ? a : b;
}
int main() {
double dc = _min( 1.4, 2.4 );
cout << "The result is " << dc << endl;
}
编译通过,结果如下:
call template min
The result is 1.4
这里调用的是 template _min();
后来吧double _min( double& a, double& b ) 改作 double _min( double a, double b )
编译通过,结果如下:
call double min
The result is 1.4
我又把 template _min 的整个函数注释掉,把double _min() 的传值参数 改为 原来的 传引用参数
编译未通过。
颇有不解。
------解决方案--------------------
整型常量属于 rvalue,不能绑定到 non-const lvalue reference 上,所以编译错误。
double _min( double const& a, double const& b );
double _min( double a, double b );
都行,就是 double& 不行。
------解决方案--------------------
我的代码如下:(平台是VS2005,系统XP)
#include <iostream>
using std::cout;
using std::endl;
double _min( double& a, double& b ) {
cout << "call " << "double min" << endl;
return a < b ? a : b;
}
template <typename T>
T _min( const T& a, const T& b ) {
cout << "call " << "template min" << endl;
return a < b ? a : b;
}
int main() {
double dc = _min( 1.4, 2.4 );
cout << "The result is " << dc << endl;
}
编译通过,结果如下:
call template min
The result is 1.4
这里调用的是 template _min();
后来吧double _min( double& a, double& b ) 改作 double _min( double a, double b )
编译通过,结果如下:
call double min
The result is 1.4
我又把 template _min 的整个函数注释掉,把double _min() 的传值参数 改为 原来的 传引用参数
编译未通过。
颇有不解。
------解决方案--------------------
整型常量属于 rvalue,不能绑定到 non-const lvalue reference 上,所以编译错误。
double _min( double const& a, double const& b );
double _min( double a, double b );
都行,就是 double& 不行。
------解决方案--------------------
- C/C++ code
#include <iostream> using std::cout; using std::endl; //这种情况无论是传值的时候是传变量都 double _min( double& a, double& b ) { cout << "call " << "double min" << endl; return a < b ? a : b; } /* //这种情况无论是传值的时候是传常量还是变量都OK double _min( double a, double b ) { cout << "call " << "double min" << endl; return a < b ? a : b; } */ //只有在没有更匹配的非模板函数的时候,才会调用 template <typename T> T _min( const T& a, const T& b ) { cout << "call " << "template min" << endl; return a < b ? a : b; } int main() { double a = 1.4; double b = 2.4; double dc = _min( 1.4, 2.4 ); //double dc = _min( a, b); cout << "The result is " << dc << endl; }