template<typename 類型參數1 , typename 類型參數2 , …> class 類名{
//TODO:
};
template<typename T1, typename T2> //這裡不能有分號 class Point{ public: Point(T1 x, T2 y): m_x(x), m_y(y){ } public: T1 getX() const; //獲取x坐標 void setX(T1 x); //設置x坐標 T2 getY() const; //獲取y坐標 void setY(T2 y); //設置y坐標 private: T1 m_x; //x坐標 T2 m_y; //y坐標 };x 坐標和 y 坐標的數據類型不確定,借助類模板可以將數據類型參數化,這樣就不必定義多個類了。
注意:模板頭和類頭是一個整體,可以換行,但是中間不能有分號。上面的代碼僅僅是類的聲明,我們還需要在類外定義成員函數。在類外定義成員函數時仍然需要帶上模板頭,格式為:
template<typename 類型參數1 , typename 類型參數2 , …>
返回值類型 類名<類型參數1 , 類型參數2, ...>::函數名(形參列表){
//TODO:
}
template<typename T1, typename T2> //模板頭 T1 Point<T1, T2>::getX() const /*函數頭*/ { return m_x; } template<typename T1, typename T2> void Point<T1, T2>::setX(T1 x){ m_x = x; } template<typename T1, typename T2> T2 Point<T1, T2>::getY() const{ return m_y; } template<typename T1, typename T2> void Point<T1, T2>::setY(T2 y){ m_y = y; }請讀者仔細觀察代碼,除了 template 關鍵字後面要指明類型參數,類名 Point 後面也要帶上類型參數,只是不加 typename 關鍵字了。另外需要注意的是,在類外定義成員函數時,template 後面的類型參數要和類聲明時的一致。
Point<int, int> p1(10, 20); Point<int, float> p2(10, 15.5); Point<float, char*> p3(12.4, "東京180度");與函數模板不同的是,類模板在實例化時必須顯式地指明數據類型,編譯器不能根據給定的數據推演出數據類型。
Point<float, float> *p1 = new Point<float, float>(10.6, 109.3); Point<char*, char*> *p = new Point<char*, char*>("東京180度", "北緯210度");需要注意的是,賦值號兩邊都要指明具體的數據類型,且要保持一致。下面的寫法是錯誤的:
//賦值號兩邊的數據類型不一致 Point<float, float> *p = new Point<float, int>(10.6, 109); //賦值號右邊沒有指明數據類型 Point<float, float> *p = new Point(10.6, 109);
#include <iostream> using namespace std; template<class T1, class T2> //這裡不能有分號 class Point{ public: Point(T1 x, T2 y): m_x(x), m_y(y){ } public: T1 getX() const; //獲取x坐標 void setX(T1 x); //設置x坐標 T2 getY() const; //獲取y坐標 void setY(T2 y); //設置y坐標 private: T1 m_x; //x坐標 T2 m_y; //y坐標 }; template<class T1, class T2> //模板頭 T1 Point<T1, T2>::getX() const /*函數頭*/ { return m_x; } template<class T1, class T2> void Point<T1, T2>::setX(T1 x){ m_x = x; } template<class T1, class T2> T2 Point<T1, T2>::getY() const{ return m_y; } template<class T1, class T2> void Point<T1, T2>::setY(T2 y){ m_y = y; } int main(){ Point<int, int> p1(10, 20); cout<<"x="<<p1.getX()<<", y="<<p1.getY()<<endl; Point<int, char*> p2(10, "東京180度"); cout<<"x="<<p2.getX()<<", y="<<p2.getY()<<endl; Point<char*, char*> *p3 = new Point<char*, char*>("東京180度", "北緯210度"); cout<<"x="<<p3->getX()<<", y="<<p3->getY()<<endl; return 0; }運行結果: