/**/ /************************************************* * 类模板成员特化 * * 再提醒一下,虽然模板的特化和类的派生之间没有任何关 * 系, 但在特化模板的时候,不妨借鉴一下派生的精神.也就意味 * 着一个完全特化或局部特化通常必须重新实现 主模板具备的 * 所有能力.*************************************************/ // 例1 // 主模板 template < typename T > class Heap ... {private: std::vector<T> h_;public: void push(const T& val); T pop(); bool empty() const //const声明在末尾表示该函数不能修改类变量 ...{ return h_.empty(); }} // 其实我们真正需要特化的是 push 和 pop两个函数. // 对比显式特化,它是通过主模板,再写一个模板显式特化版本类; // 而这里只是对类模板成员进行了单独特化. template <> void Heap < const char *> ::push( const char * const & pval) ... { h_.push_back(pval); std::push_heap(h_.begin(),h_.end(),strLess);} template <> const char * Heap < const char *> ::pop() ... { std:pop_heap(h_.begin(),h_end(),strLess); const char* tmp = h_.back(); h_.pop_back(); return tmp;} /**/ /************************************************* * 注意,这些函数的接口必须和 "它们正在特化其成员" 的模 * 板的相应接口相匹配.如例1, 就得和主模板的接口相匹配.而如 * 果你是自己再定义的一个显式/局部特化版本类,就不需要匹配 * 一致.(见显式特化和局部特化) * 最后指出两点: 首先,除了成员函数外,其实成员也可以被 * 显式特化,如静态成员和成员模板. * 其次,显式特化是为模板或模板成员提供定制版本的一种 * 手段;而显式实例化仅仅是明确地告诉编译器去实例化一个成 * 员. *************************************************/