在我们熟知的VC6.0编译环境下,有的时候会给出一些反常的情况,程序在调试过程中会给出一些我们觉得不对的事情,代码如下。
#include<iostream>
using namespace std;
template<typename Type>
Type Max(Type a, Type b)
{
return a>b?a:b;
}
void main()
{
Max(1,2);
Max(1.1,2.2);
}
int Max(int a, int b)
{
return a>b?a:b;
}
像上面的代码,如果是按照我们的分析,程序在执行main函数后,遇到Max函数,因为非模板函数在main函数下,并没有读到,所以按道理不应该执行非模板函数int Max,应该执行模板函数Type Max,然后按照模板函数的意图,会产生一个int Max函数,然后判断大小,这个过程叫做实参演绎。但是进入调试状态后,遇到第一个Max(1,2),他直接跳到下面的int Max()函数,进行判断,结果出乎我们的意料,因为按照我们的理解程序并没有读到底下的Max,这在《C++Templates》里也提到过,书中的意思是必须将模板的重载版本也就是int Max()放在模板函数被调用之前。其实就是如果你想自己写一个做实参演绎,而让系统直接调用他的话,就得将这个函数写在模板函数之前。
#include<iostream>
using namespace std;
int Max(int a, int b)
{
return a>b?a:b;
}
template<typename Type>
Type Max(Type a, Type b)
{
return a>b?a:b;
}
void main()
{
Max(1,2);
Max(1.1,2.2);
}