第16章 模板与泛型编程(15)

2014-11-24 12:26:54 · 作者: · 浏览: 3

16.6.2 类模板的特化

1. 定义类特化

template<>
class Queue{
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<< (ostream &os, const Queue &q);
private:
Queue real_queue;
};
template<>
class Queue{
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<< (ostream &os, const Queue &q);
private:
Queue real_queue;
};

特化可以定义与模板本省完全不同的成员。如果一个特化无法从模板定义某个成员,该特化类型的对象就不能使用该成员。类模板成员的定义不会用于创建显式特化成员的定义。

类模板特化应该与它所特化的模板定义相同的接口,否则当用户试图使用未定义的成员时,会感到奇怪。

2.类特化定义

在类特化外部定义成员时,成员之前不能加template<>标记。

void Queue::push(const char* val)
{
return real_queue.push(val);
}
void Queue::push(const char* val)
{
return real_queue.push(val);
}
16.6.3 特化成员而不特化类

template<>
void Queue::pop()
{
QueueItem *p=head;
delete head->item;
head=head->next;
delete p;
}
template<>
void Queue::pop()
{
QueueItem *p=head;
delete head->item;
head=head->next;
delete p;
}成员特化的声明与任何其他函数模板特化一样,必须以空的模板形参表开头。

template<>
void Queue::pop();

摘自 xufei96的专栏