上一篇文章《c++模板学习》中函数模板的例子:
#include <iostream>
using std::cout;
using std::endl;
//声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,
//T可以被任何字母或者数字代替。
template <class T>
T min(T& x,T& y)
{ return(x<y)?x:y;}
int main( )
{
int n1=2,n2=10;
double d1=1.5,d2=5.6;
cout<< "较小整数:"<<min(n1,n2)<<endl;
cout<< "较小实数:"<<min(d1,d2)<<endl;
system("PAUSE");
return 0;
}
在运行的时候会出错,错误提示如下:
这是因为在文件xutility中也定义了一个min函数,这个头文件一定是被包含在了iostream类的相关文件中,如下:
#define _IMPL_MIN min
// TEMPLATE FUNCTION min
template<class _Ty> inline
const _Ty& (__CLRCALL_OR_CDECL _IMPL_MIN)(const _Ty& _Left, const _Ty& _Right)
{ // return smaller of _Left and _Right
return (_DEBUG_LT(_Right, _Left) ? _Right : _Left);
}
因此在main()函数中调用的时候编译器分不清调用哪个。
解决方法:
将自己定义的模板改个名字就可以了。
还有一个方法是将模板定义成如下形式:
template <class T>
T min(T& x,T& y)
{
return(x<y)?x:y;
}
这样定义的话就和xutility文件中的定义一样了,所以编译器编译的时候也不会有二义性。