#include <iostream.h>
#define max(a,b) ((a) > (b) ? (a) : (b))
using namespace std;
template <class T>
T max(T a, T b){
return a > b ? a:b ;
};
void main(){
int a = 1;
int b = 2;
max(a,b); //想调用宏
max(a,b); //想调用T
}
本段代码都有什问题?
1. 模板template<class T>T max(T a, T b) 在标准库里面已经有定义了,不能再重新定义应用。
2. 不过C++模板有一个特殊的机制:模板中的代码只有在用到时才会被实例化。也就是说,当遇到template<class T> T max(T a, T b) 时,编译器并不会完全展开整个模板类。只有当访问了模板上的T max(T a, T b)函数时,才会将成员函数的代码展开作语义检查,此时编译会报错。
3.宏和模板的功能实现是在不同的时期进行的,宏在编译前就对max(a,b)做了字符串替换工作,所以在后面对模板进行词发分析时会产生错误,导致编译都不能通过,这里只将宏和模板定义的函数不重名就会解决本问题了!