1 定义成员模板
模板成员声明看起来像任意模板的声明一样。
template成员声明的开头是自己的模板形参表。构造函数和assign函数各有一个模板类型形参,这些函数使用这些类型形参作为其函数形参的类型,他们函数class Queue{ public: template Queue(It beg,It end){ copy_elems(beg,end); } template void assign(Iter,Iter); private: template void copy_elems(Iter,Iter); }; template template void Queue ::assign(Iter beg,Iter end){ //destroy(); copy_elems(beg,end); } template template void Queue ::copy_elems(Iter beg,Iter end){ while(beg != end){ push(*beg); ++beg; } }
形参指明要复制元素范围的迭代器。
在类模板作用域外部定义成员模板的时候,那必须包含两个模板形参表:
templatetemplate void Queue ::assign(Iter beg,Iter end){ //destroy(); copy_elems(beg,end); }
当成员模板时类模板的成员时,它的定义必须包含类模板形参以及自己的模板形参。
首先是类模板形参表,后面接着是自己模板形参表。
assign函数定义的开头为:
template
3 成员模板的实例化
成员模板只有在程序使用时才实例化。类模板的成员模板的实例化要比类模板的普通成员函数的实例化要复杂一些。
成员模板有两种模板形参:(1)由类定义的(2)由成员模板本身定义的
类模板形参由调用函数的对象的类型确定,成员定义的模板形参的行为与普通函数模板一样。这些形参都通过常规模版实参推断确定。
short a[4] = {0,3,6,9};
Queue
qi(a,a+4);
vector
vi(a,a+4); qi.assign(vi.begin(),vi.end());
因为所构造的是Queue
void Queue
对assign的调用将实例化qi的成员。qi具有Queue
void Queue