16.4.5 成員模板
任意類(模板或非模板)可以擁有本身為類模板或函數模板的成員,這種成員稱為成員模板(member template),成員模板不能為虛。
1. 定義成員模板
template <class Type>
class Queue{
public:
Queue():head(0), tail(0){}
Queue(const Queue &Q):head(0), tail(0)
{copy_elems(Q);}
Queue& operator=(const Queue&);
~Queue(){destroy();}
Type& front()
{return head->item;}
const Type &front() const{return head->item;}
void push(const Type &);
void pop();
bool empty() const
{return head==0;}
friend ostream &operator<< <Type>(ostream &os, const Queue<Type> &q);
template<class It>
Queue(It beg, It end):head(0), tail(0){copy_elems<It>(beg,end)}
template<class Iter>
void assign(Iter, Iter);
private:
QueueItem<Type> *head;
QueueItem<Type> *tail;
void destroy();
void copy_elems(const Queue&);
template <class Iter>
void copy_elems(Iter,Iter);
};
template <class Type>
class Queue{
public:
Queue():head(0), tail(0){}
Queue(const Queue &Q):head(0), tail(0)
{copy_elems(Q);}
Queue& operator=(const Queue&);
~Queue(){destroy();}
Type& front()
{return head->item;}
const Type &front() const{return head->item;}
void push(const Type &);
void pop();
bool empty() const
{return head==0;}
friend ostream &operator<< <Type>(ostream &os, const Queue<Type> &q);
template<class It>
Queue(It beg, It end):head(0), tail(0){copy_elems<It>(beg,end)}
template<class Iter>
void assign(Iter, Iter);
private:
QueueItem<Type> *head;
QueueItem<Type> *tail;
void destroy();
void copy_elems(const Queue&);
template <class Iter>
void copy_elems(Iter,Iter);
};2. 在類外部定義成員模板
當在類模板作用域外部定義成員模板的時候,必須包含兩個模板形參表。
template<class Type>
template<class Iter>
void Queue<Type>::assign(Iter beg, Iter end){
destroy();
copy_elems(beg,end);
}
template<class Type>
template<class Iter>
void Queue<Type>::assign(Iter beg, Iter end){
destroy();
copy_elems(beg,end);
}因為assign函數刪除現存容器中的成員,所以傳給assign函數的迭代器有必要引用不同容器中的元素。標准容器的assign成員和迭代器構造函數有相同的限制。
3. 成員模板遵循常規訪問控制
成員模板遵循與任意其他類成員一樣的訪問規則。
4. 成員模板和實例化
與其他成員一樣,成員模板只有在程序中使用時才實例化。成員模板有兩種模板形參:由類定義的和由成員模板本身定義的。類模板形參由調用函數的對象的類型確定,成員定義的模板形參的行為和普通函數模板一樣,這些形參都通過常規模板實參推斷而確定。
摘自 xufei96的專欄