任意类(模板或非模板)可以拥有本身为类模板或函数模板的成员,这种成员称为
成员模板,成员模板
不能为virtual。
模板成员声明看起来像任意模板的声明一样:
template <class Type> class Queue {
public:
// construct a Queue from a pair of iterators on some sequence
template <class It>
Queue(It beg, It end):
head(0), tail(0) { copy_elems(beg, end); }
// replace current Queue by contents delimited by a pair of iterators
template <class Iter> void assign(Iter, Iter);
// rest of Queue class as before
private:
// version of copy to be used by assign to copy elements from iterator range
template <class Iter> void copy_elems(Iter, Iter);
};
|
在类外定义时,当成员模板是类模板的成员时,它的定义必须包含类模板形参以及自己的模板形参。首先是类模板形参表,后面接着成员自己的模板形参表
template <class T> template <class Iter> //注意此行
void Queue<T>::assign(Iter beg, Iter end)
{
destroy(); // remove existing elements in this Queue
copy_elems(beg, end); // copy elements from the input range
}
|
访问控制:成员模板遵循与任意其他类成员一样的访问规则。如果成员模板为私有的,则只有该类的成员函数和友元可以使用该成员模板。
与其他成员一样,成员模板只有在程序中使用时才实例化。类模板的成员模板的实例化比类模板的普通成员函数的实例化要复杂一点。成员模板有两种模板形参:由类定义的和由成员模板本身定义的。类模板形参由调用函数的对象的类型确定,成员定义的模板形参的行为与普通函数模板一样。这些形参都通过常规模板实参推断而确定。
类模板中的static成员:
template <class T> class Foo {
public:
static std::size_t count() { return ctr; }
// other interface members
private:
static std::size_t ctr;
// other implementation members
};
|
每个该类的实例有自己的静态成员。
Foo
fi;
Foo fs;
其中模板实参相同的对象共有该类型的静态成员。
使用时必须引用实例的实例化:
例如: fi.ctr 或 Foo::ctr 不可像普通类Foo::ctr
类外定义时,前还要有template template
size_t Foo::ctr = 0
如果是成员函数,static 成员函数只有在程序中使用时才进行实例化。
阅读(595) | 评论(0) | 转发(0) |