世界上最大的人是:关于c++模版的简单问题

来源:百度文库 编辑:高考问答 时间:2024/05/12 10:21:48
#include <iostream.h>

template <class T>
T max(T a,T b)
{
return (a>b)?a:b;
}
int max(int, int );

void f(int num,char cha)
{
cout<<max(num,num)<<endl;
cout<<max(cha,cha)<<endl;
cout<<max(num,cha)<<endl;
cout<<max(cha,num)<<endl;
}
int main()
{
int a;
char c;
cin>>a>>c;
f(a,c);
return 0;
}
请问这个程序的错误是什么意思?还有为什么max(num,num)调用的是max(T,T),而不是重载的max(int ,int)?谢谢
D:\非模版函数重载.cpp(14) : error C2782: 'T __cdecl max(T,T)' : template parameter 'T' is ambiguous
但是C++中,函数模版与同名的非模版函数的重载规则中,首先是寻找一个参数完全匹配的函数,如果找到,就调用它,第二部才会去寻找一个函数模版啊(<<面向对象C++>>陈文宇 编著P261)
那么max(num,num)不是该调用int max(int, int )吗?还有这个程序也是书上的例子.......
加了实现还是一样的错误,应该就是二义性问题吧

1.这个错误是说类型T无法被确定。很显然,根据你的定义,若调用template版的max函数,则两个参数应具有相同的类型,但你这里一个是char,一个是int,编译器就糊涂了。当然你会想到隐式类型转换,那你说是应该把char转成int,还是把int转成char?这个二意性是编译器无法接受的。

2.至于为什么编译器在这里认为你调用的是template版的max,其实你这里的函数定义就是有二意性的,max(num, num)被解释为调用哪一个函数都是合法的,编译器在这里自作主张的解释为调用template版也没有错。在有些规则严格的编译器上这种二意性会被报错,你的编译器已经很“宽容”了:)

3.对于你的补充:出现这样的结果是否跟你没有实现(Implement)int版的函数有关?你的代码里面只做了声明(Declaration),调用该版本的函数将会产生一条“目标函数体不存在”的连接错误。你给它加个实现再试试。

关于你说的这条原则,实话说我也记不清了,在日常的项目中,我总是会尽力避免书写可能存在二义性的代码——这样也会增强你代码的可读性。其实我认为也没必要在这种细枝末节的地方花这么大的精力去记忆,到时候如果一定要用到,临时试验一下就很清楚了——其实每个编译器对于各种C++特性的支持往往存在一定差异,这和ANSI C++直到很晚在正式出台这个历史原因有关系。