第16章 模板与泛型编程(15)
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的专栏
补充:软件开发 , C++ ,