16.6.2 類模板的特化
1. 定義類特化
template<>
class Queue<const char*>{
public:
string& front()
{return real_queue.front();}
const string &front() const{return real_queue.front();}
void push(const char*);
void pop();
bool empty() const
{return real_queue.empty();}
friend ostream &operator<< <const char*>(ostream &os, const Queue<const char*> &q);
private:
Queue<string> real_queue;
};
template<>
class Queue<const char*>{
public:
string& front()
{return real_queue.front();}
const string &front() const{return real_queue.front();}
void push(const char*);
void pop();
bool empty() const
{return real_queue.empty();}
friend ostream &operator<< <const char*>(ostream &os, const Queue<const char*> &q);
private:
Queue<string> real_queue;
};
特化可以定義與模板本省完全不同的成員。如果一個特化無法從模板定義某個成員,該特化類型的對象就不能使用該成員。類模板成員的定義不會用於創建顯式特化成員的定義。
類模板特化應該與它所特化的模板定義相同的接口,否則當用戶試圖使用未定義的成員時,會感到奇怪。
2.類特化定義
在類特化外部定義成員時,成員之前不能加template<>標記。
void Queue<const char*>::push(const char* val)
{
return real_queue.push(val);
}
void Queue<const char*>::push(const char* val)
{
return real_queue.push(val);
}
16.6.3 特化成員而不特化類
template<>
void Queue<const char*>::pop()
{
QueueItem<const char*> *p=head;
delete head->item;
head=head->next;
delete p;
}
template<>
void Queue<const char*>::pop()
{
QueueItem<const char*> *p=head;
delete head->item;
head=head->next;
delete p;
}成員特化的聲明與任何其他函數模板特化一樣,必須以空的模板形參表開頭。
template<>
void Queue<const char*>::pop();
摘自 xufei96的專欄