模板的显式特化的注意事项:
一、
指定的模板实参列表必须喝相应的模板参数列表一一对应。例如,我们不能用一个
非类型值来替换一个模板参数。然而,如果模板参数具有缺省模板实参,那么用来替换的
模板实参就是可选的:
template <typename T>
class Types{
public:
typedef int I;
};
template <typename T,typename U=typename Types<T>::I>
class S;
template<>
class S<void>//ok
{
public:
void f();
};
template<>
class S<char,char>;//ok
template<>
template<> class S<char,0>;//error.不能用0来代替U
二、全局成员特化
#include <iostream>
using namespace std;
template<typename T>
class Outer{/1
public:
template<typename U>
class Inner
{
private:
static int count;
};
static int code;//4
void print()const//5
{
std::cout<<"generic"<<endl;
}
}
/*在4处的code和5处print(),这两个普通成员都具有一个外围类模板,因此需要用一个
*template<>前缀说明:后面将用一个模板实参集来对他进行全局特化
*/
template<>
int Outer<void>::code=12;
template<>
void Outer<void>::print() const
{
std::cout<<"Outer<void>"<<endl;
}
/*1.上面的这些定义会用于代替类Outer<void>在4和5处的泛型定义;但是类Outer<void>的
*其他成员仍然默认地产生于1处的模板。
*2.在提供了上述声明后,就不能再次提供Outer<void>的显示特化
*/