如果函数是以通用类型为返回类型,则要在函数名前的类名后缀上“<T>”。例如:

 

template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}
template<class T>
T Test<T>::operator+(T x){
return n + x;
}
  C. 在类定义体外初始化const成员和static成员变量的做法和普通类体外初始化const成员和static成员变量的做法基本上是一样的,的区别是需再对模板进行声明,例如
template<class T>
int Test<T>::cnt=0;
template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}
  (3) 类模板的使用 类模板的使用实际上是将类模板实例化成一个具体的类,它的格式为:类名<实际的类型>。
  模板类是类模板实例化后的一个产物。说个形象点的例子吧。我把类模板比作一个做饼干同的模子,而模板类是用这个模子做出来的饼干,至于这个饼干是什么味道的要看你自己在实例化时用的是什么材料了,你可以做巧克力饼干,也可以做豆沙饼干,这些饼干的除了材料不一样外,其他的东西都是一样的了。
  3.函数模板和模板函数
  (1)函数模板
  函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的大特点是把函数使用的数据类型作为参数。
  函数模板的声明形式为:
  template<typename(或class) T>
  <返回类型><函数名>(参数表)
  {
  函数体
  }
  其中,template是定义模板函数的关键字;template后面的尖括号不能省略;typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符。这样,在以后定义的这个函数中,凡希望根据实参数据类型来确定数据类型的变量,都可以用数据类型参数标识符来说明,从而使这个变量可以适应不同的数据类型。例如:
  template<typename(或class) T>
  T fuc(T x, T y)
  {
  T x;
  //……
  }
  函数模板只是声明了一个函数的描述即模板,不是一个可以直接执行的函数,只有根据实际情况用实参的数据类型代替类型参数标识符之后,才能产生真正的函数。
  (2)模板函数:
  模板函数的生成是将函数模板的类型形参实例化的过程。
  例如:
  double d;
  int a;
  fuc(d,a);
  则系统将用实参d的数据类型double去代替函数模板中的T生成函数:
  double fuc(double x,int y)
  {
  double x;
  //……
  }