当前位置:编程学习 > C/C++ >>

第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++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,