一.
1 可以为类模板的模板参数提供默认参数,函数模板却不行。
2可以为类模板进行偏特化,而函数模板却不行。
二.模板参数
1 类型(可以是内建类型或是用户自定义类型)
2 无类型参数(整数,指针,某些静态实体的引用 例:bitset)
3 其他模板
三.关于typename
若一个模板代码内部的某个类型被模板类型参数所限定,则必须使用关键字typename作为前缀进行声明(构造函数的初始化列表中除外)
原因:
Template <class T>
class X
{
Typename T::id i;//如果无typename的话,将出错
…
}
这个模板定义假定,处理的类T中必须拥有某种称为id的嵌套类型,id也可以是一个T的静态数据成员或枚举类型等。然而编译器默认这个标示符是一个数据对象,而非类型,因此当用此模板参数的嵌套类型来声明对象时,必须加typename进行声明。
四.关于函数模板
对于函数模板,可以省略掉模板参数,编译器会从函数的参数中推断出它们的类型。不允许使用默认模板参数。
然如果有一个函数模板,它的模板参数即作为参数类型又作为返回类型那么一定要首先申明函数的返回参数类型,否则就不能神略掉函数参数表中的任何类型参数。如:
Template <typename R,typename P>
R imolicit_cast(const P& p)
{
Return p;
}
int main()
{
int I = 1;
float x = implicit_cast<float>(i);
int j = implicit_cast<int>(x);
}
如果将第一行的模板参数R和P交换,则会编译出错,因为第一个模板参数作为函数的参数类型。
五.模板类的声明与定义
传统的编程方法中,普通函数的声明与定义相分离是一种比较好的设计,然在使用类模板技术时, 模板类的声明与定义都放在.h文件中程序会顺利的运行。如果想在.h和.cpp中分开实现,则需采取几种特别的处理技术来实现,否则会出现连接错误(类似error LNK2019: 无法解析的外部符号)。
1 C++ 模板类的声明与定义分别放在 H 文件 和 CPP文件中 在使用时需要把 CPP文件也饱含与当前文件中 如: #include "文件名.cpp"。
2 在template前加关键字export(相当部分编译器不支持)
3 在类模板实现的cpp文件中实例化其他文件中要用到的类型
原因:模板类有着编译器多态的性质,是一种隐式接口,编译器在编译期间会根据不同的模板参数类型具现化类,如果将模板类的声明和实现相分离(即分别置于.h文件和.cpp文件中时),编译器会将.cpp编译成obj文件,当其他文件使用到这个模板类时,如果不采取以上提供的几种方法,编译器只能具现化模板类的声明,并不能具现化它的实现(其实现文件已编译成obj文件),因此在链接的时候会出现链接错误。