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;
}
運行結果: