模板:代码生成器
1)模板在使用中不能将声明与实现放在不同的文件中然后在实现中只INCLUDE声明
2)模板编译
当编译器遇到一个模板定义时 他并不生成代码只有当我们实例化一个模板的特定版本时,编译器才会生成代码。
这就造成发生编译错误时的时机 需要特别理解
1.首先编译模板本身时 编译器只会检查语法错误和拼写错误
2.编译器在模板使用时,会检查实参数目是否正确
3.模板实例化时,发现与类型相关的错误 //真正执行代码的时候才会发现,所以可能出现在链接执行的时候
比如一个返回最大值的函数max
Template<typename T> T max(const T &a,const T&b)
{
If(a<b) return b;
If(a>b) return a;
If(a==b) retun a;
}
我们定义一个类 DataNum da1,da2;
Max(da1,da2);
结果在实例化的时候就可能是错误的,因为我们没有给DataNum类定义重载运算符“<”
2)函数模版的隐式/显示实例化
`#include
using namespace std;
template
T Max(T x, T y) //函数模版的实现
{
return (x > y ? x : y);
}
对于这样的一个模板我们在生成实例时可以使用显示实例化 和隐式实例化
#include
Max(intX, intY) //隐式实例化
cout << Max<int>(intX, intY) << endl;//显示实例化
3)类模板
为了使用类模板 我们必须在模板名后面的尖括号中提供二外信息-即用来代替模板参数的模板实参列表
//用栈为例子
using namespace std;
template