實際上有三種類型模板參數:類型模板參數、無類型模板參數和模板模板參數(以模板做爲模板的參數)。 1、類型模板參數 類型模板參數是咱們使用模板的主要目的。咱們能夠定義多個類型模板參數: template<typename T,typename Container> class Grid {...} 一樣,也能夠爲類型模板參數指定默認值: #include <iostream> using std::vector; template<typename T,typename Contianer=vector<T> > //注意空格 class Grid {...} 2、模板模板參數(template template parameter) 就是將一個模板做爲另外一個模板的參數。 正如上面的一個例子: Grid<int,vector<int> > myIntGrid; 注意其中int出現了兩次,必須指定Grid和vector的元素類型都是int。 若是寫成: Grid<int,vector> myIntGrid; 由於vector自己就是一個模板,而不是一個類型,因此這就是一個模板模板參數。指定模板模板參數有點像在常規的函數中指定函數指針參數。 函數指針類型包括返回類型和函數的參數類型。在聲明模板模板參數的時候也要包括完整的模板聲明: 首先要知道做爲參數的模板的原型,好比vector template<typename E,typename Allocator=allocator<E> > class vector {...}; 而後就能夠定義: template<typename T,template<typename E,typename Allocator=allocator<E> >class Container=vector> class Grid { public: //Omitted for brevity Container<T>* mCells; }; 模板模板參數的通常語法: template<other params,...,template<TemplateTypeParams> class ParameterName,other params,...> 舉例一個應用,Grid的一個構造函數: template<typename T,template<typename E,typename Allocator=allocator<E> >class Container> Grid<T,Container>::Grid(int inWidth,int inHeight): mWidth(inWidth),mHeight(inHeight) { mCells=new Container<T> [mWidth]; //注意此處Container<T>說明,實際上仍是說明 Grid<int,vector<int> > for(int i=0;i<mWidth;++i) mCells[i].resize(mHeight); } 使用的時候,與通常的沒有什麼區別: Grid<int,vector> myGrid; myGrid.getElement(2,3); 注意:不要拘泥於它的語法實現,只要記住可使用模板做爲模板的一個參數。 3、無類型模板參數 無類型模板參數不能是對象,甚至不能是double或者float。無類型參數僅限於int、enmu、指針和引用。 有時可能想要容許用戶指定一個特定值的元素來初始化空對象,可使用如下的方法: template<typename T,const T EMPTY> class Grid { public: //Omitted for brevity Grid(const Grid<T,EMPTY>& src); Grid<T,EMPTY>& operator=( const Grid<T,EMPTY>& rhs); //... }; 咱們能夠這樣使用: Grid<int,10> myIntGrid; Grid<int,20> myIntGrid2; 初始值能夠是任意的int數,也就是必須是int、enmu、指針和引用的一種。 4、指針和引用模板參數 指針和引用模板參數必須指向全部翻譯單元中均可用的全局變量。對於這些類型的變量,相應的技術術語就是帶有外部鏈接的數據。 使用extern聲明便可。 如: template<typename T ,const T& EMPTY> class Grid {...}; extern const int emptyInt=0; Grid<int,emptyInt> myIntGrid; 對於初始化咱們還可使用「零初始化」即 T().