今天看见c++中关于类模版的定义有两种,首先,类模版的定义和声明都以关键字template开头,后面接上以逗号分隔的模版参数表(template parameter list),模版参数表以<>括起来,模版参数一种是类型参数(type parameter),另一种是非类型参数(nontype parameter)。关于类型参数模版不多说了,有关键字class或typename接上后面的标识符构成,例如template<class T> template <typename T>,对于非类型参数模版(nontype parameter)需要注意的是它由普通参数声明构成的,它代表类模版中的一个常量,例如定义template<int a,int b>,这之后就要注意了,给定的非类型参数的表达式必须是一个常量表达式,但是名字空间域的对象的地址可以被用作非类型模版参数的实参,因为名字空间域任何对象的地址是常量表达式(即使不是const定义的),而局部对象的地址不是。例如 template <int a >class A{}; template <int *ptr> class Ap{}; int size=11; const int size_ =12; 则以下的表达式都是可以的 :
A<11> a0;
A<size_> a1;
A<sizeof(size)> a2;