template(模板)是一些函数或者类,这些类中有一些参数的类型没有指定,需要运行时确定。比如:
template <class T>
T add(T a, T b)
{
return a + b;
}
其中T在调用这一函数的时候指定。T可以命名为其他变量,但是习惯上命名为T。
T的类型被分类为class(类),但是T也可以不是一个class,上面的例子可以是int等基本类型,更进一步上来说T可以是提供了template中使用的方法的类型,比如重载了运算符的类。
上面的class一般情况下可以用typename替代,上面的例子表示为:
template <typename T>
T add(T a, T b)
{
return a + b;
}
一般情况下不会有问题,当T是一个类的时候使用typename也是没有问题的,但是在模板类中嵌套模板的时候会报错。
typename主要用于在模板中指定后面的标识符为一个类型,比如:
template <class T>
class MyClass
{
typename T::SubType * ptr;
// ...
}
上面的ptr是一个T::SubType类型的指针,如果不使用typename的话会被当做一个T的静态成员。
类似上面的模板类在实例化的时候传入的类需要有一个SubType,不然会报错。