C++中类模板(class template)和模板类(template class)的区别

常说的类模板(class template)和模板类(template class),但事实上二者有着很大的区别。

考虑下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename T1 , typename T2>
class Someclass
{

};
// 模板参数实例化后的类,not object instance

typedef Someclass<int,double> TemplateClassType;

template< typename T1>
class Someclass< typename T1 , double>
{

};

typedef Someclass<int> AnotherTemplateClassType;

先解释模板类,模板类是将模板中的参数实例化或特化后的类型,是编译器为类模板生成的一个具体的类,这叫编译器多态(也叫静态多态)。

而类模板,顾名思义,是一种模板,而不是类,不能直接使用。对这类模板的使用者来说,看到的,用到的类(Someclass<int,double>和Someclass)都是类模板的实例化后的类。有点类似于一个的类实例化后得某个对象一样,但是类模板实例化可以得到不同的具体的类,而一个类实例化后得到的是具有相同行为的对象。