12.3.4 显式特化

    不论是隐式实例化还是显式实例化,都是使用模板来生成类定义,而特化是特定类型(用于替换模板中的通用类型)的定义,抛开了模板而使用独立的专门的类定义。

    显式特化(Explicit Specialization)也称完全特化,其基本格式如下所示。


    template<>class类名<特殊类型> { //类定义 }

    如果对某个特殊类型进行了显式特化处理,显式特化定义的类优先于通用模板类,类似于覆盖或隐藏的操作。

    如下代码12.8中的Stack.h与代码12.7相同,也就是说,两个代码中通用类模板的定义相同。

    代码12.8 类模板的显式特化ClassTemplateExplicitSpecialization


    <———————————文件名:example1208.cpp———————————————-> 01 #include<iostream> 02 #include"Stack.h" 03 using namespace std; 04 template<>class Stack<double,5> 05 { 06 private: 07 double sz[5];//此处的5个元素与显式特化中的5无关 08 int point;//指针,表示存储位置(即元素个数) 09 public: 10 Stack();//构造函数 11 bool isNotEmpty();//判断栈是否为空 12 }; 13 Stack<double,5>:Stack() 14 { 15 point=0;//初始位置为0,栈底 16 } 17 bool Stack<double,5>:isNotEmpty() 18 { 19 return point!=0;//point为0,说明当前无元素 20 } 21 int main() 22 { 23 Stack<double,5>st;//调用显式具体化生成的类定义 24 cout<<st. isNotEmpty()<<endl; 25 return 0; 26 }

    输出结果如下所示。


    0

    【代码解析】代码第4行,显式特化了类Stack<double,5>,不再沿用通用模板类的定义,而是单独定义了一个类,上述代码为了简单起见,只定义了一个成员函数isNotEmpty,此时,再用创建的st调用isEmpty函数和isFull函数,编译器会报错,因为这些函数并没有在类Stack<double,5>中进行定义。