C++模板支持“成员模板”新特性。即模板可以用作结构、类或模板类的成员。在完全实现STL设计的过程中,必须使用这项特性。成员模板的定义一般为任意类(可以是类模板,也可以不是类模板)可以拥有类模板或函数模板作为其成员。
在ISO/IEC 14882:2003(E)中,关于成员模板的说明是:一个模板可以在-一个类或类模板中声明,这样的类模板称为成员模板;成员模板的定义既可以在类(或类模板)定义内部,也可以在类(或类模板)定义的外部:当类模板的成员模板在类模板定义的外部定义时,应该完整地指定类模板的参数和成员模板的参数。例如:
template <class T>template <class I> void queue::assign(I beg, I end);
上述代码中template < class T>是类模板,作为第一个模板形参表; template< class T>是成员模板,作为第二个模板形参表。
下面举例说明:
template <class T>class string //类模板string
{
public:
template<class T2>int compare (const. T2&);
}
template <class T>template<class T2>int string<T>: :compare (const T2& s) //在类外部定义成员函数
{
......
}
上述代码在类模板string中,使用了另一个类模板类型的成员函数。
template <typename T> class bC
{
public;
template <typename V> class HC //类模板HC作为模板bC的成员
{
public:
V m;
V n;
public:
HC(){} ;
void show() {cout<<m<<endl;};
}
HC <T> A;
HC<int>B;
public:
bC(){};
template <typename U>U show m(){ }; //类模板定义成 员函数
}
上述代码举例说明使用类模板作为另一类模板的成员。另外,成员模板具有一些使用规则。
- 成员模板遵循常规访问控制;
- 成员模板不能为虚(virtue);
- 局部类不能拥有成员模板;
- 析构器不能是模板类型;
- 成员函数模板不能重载基类的虚函数;
- 成员模板具有复杂的转换功能。
总结: 最简单的理解即在类模板中包含类模板,被包含的类模板作为其成员。