最近在研习C++ Templates,看到chapter12,特化与重载,觉得很重要,特此区分出来:
 
类模板全局特化:
template<typename T>

class A { public: void showMe(){ cout << "A" << endl; } };

//特化

template<>

class A<int> { public: void showMe(); };

//不能写template<>前缀

void A<int>::showMe() { cout << "A<int>" << endl; }
 
类模板局部特化:
template<typename T1, typename T2>

class A;

template<typename T> class A<T,T>; //局部特化1

template<typename T> class A<T, int>; //局部特化2

template<typename T1, typename T2> class A<T1*, T2*>; //局部特化3

 
 
类模板参数缺省:
template<typename T = int>

class A;

A<> a; //相当于A<int> a;  不能去掉<>
 
类模板的类模板参数:
template<template<typename Ta> class Tb>

class A{ Tb<int> obj1; Tb<float> obj2 };

 
 
成员函数模板:
template<typename T> class A { public: template< typename T2> void showMe( T2 );};

//恶心的定义

template<typename T>

template<typename T2>

void A<T>::showMe( T2 obj ) { cout << "A::showMe(" << obj << ") " << endl; }

 
 
类模板成员全局特化:
template<typename T>

class A { static int obj; void showMe(); };

//静态数据成员全局特化

template<> int A<void>::obj = 110;

//普通成员全局特化

template<> void A<void>::showMe() { cout << "A<void>::showMe()" << endl; }

 
 
函数模板:
template<typename T> T max( T const&, T const& );
 
函数模板全局特化:
template<typename T> T max( T const&, T const& );

//特化

template<> T max( int const&, int const& ); //可以借助函数参数推断模板参数

 
 
非类型参数:
template<int size>class A{};

template<int lenght> void max( );

 
 
显式实例化:
template<typename T> class A{};

template class A<int>; //生成A<int>的实现,这是一种编译器优化

 
 
备注1:全局特化后并非模板,可以看成模板的其中一个实例,因此应该避免重定义的情况出现。
备注2:非类型参数只能是整型常数。