2.5 类模板的用法
类是C++(www.cppentry.com)中一个非常重要的概念,所涉及内容纷繁芜杂,而类模板作为对类的更高层抽象,其所涵盖内容更加繁杂。简单几个例子无法尽述类模板的各个方面,本节介绍几种比较常见的类模板用法。
2.5.1 成员函数模板
在此前的例子中都是类模板中有成员函数,而对于普通类来说,也可以有成员函数模板,如以下代码所示:
- struct normal_class
- {
- int value;
- template<typename T>
- void set(T const &v) {value = int(v);}
- template<typename T>
- T get();
- };
-
- template<typename T>
- T normal_class::get()
- {
- return T(value);
- }
普通类中的成员函数模板可以在类中当场实现,也可以在类外单独实现。在类外实现时,由于类不是模板,无需在类名后增加模板实参列表。
类模板的成员函数还可以有额外的模板参数,如:
- template<typename T0>
- struct a_class_template
- {
- T0 value;
-
- template<typename T1>
- void set(T1 const &v){value = T0(v);}
-
- template<typename T1>
- T1 get();
- };
-
- // 类模板的成员函数模板在类模板外的实现方法
- template<typename T0> template<typename T1>
- T1 a_class_template<T0>::get()
- {
- return T1(value);
- }
注意 成员函数模板的参数不能与类模板参数同名,否则会造成命名冲突;但不同成员函数模板的参数名并不相干,可以同名。在类模板内实现成员函数模板时与之前情况无异,成员函数模板参数只在本函数实现体内可见。而在类模板之外实现成员函数模板时,需要用到两个template关键字分别引导类模板与成员函数模板的参数,其他则与之前无异。