從事C++挺久了,在前段時看書時,發現高手,都是在寫模板無,泛型編程,頓感差距。自己連模板都沒有寫,於是就小小的研究了下模板的用法。
模板簡而言之就是對某此對象的相同方法,或處理方式,進行歸納,總結,生成一個可以處理共同部份,適應多種不同對象的方法。在C語言時代就是宏定義方法。用#define定的一個方法,不過,C時代只是對函數方法的處理,還沒有對象概念,這和後來的C++函數模板一樣。
1.類模板
請參見
http://www.cnblogs.com/waytofall/archive/2012/06/26/2563642.html
1.函數模板
1.模板函數為不同的模板實參定義了一個函數家族。它的表示看起來和普通的函數很相似,唯一的區別是有些函數元素是未確定的:這些參數將在使用的時候被參數化。
template <typename T> inline T const& max(T const& a,T const& b) { return a<b ? b : a; }
上述例子中的參數類型沒有確定,用模板參數T來代替。
2.函數模板的實例化:使用具體的類型代替模板參數的過程。這個過程產生了一個模板的實例。這個過程是在編譯的時候進行的。
模板內部的操作要被進行參數的類型所支持,否則會出錯。
在編譯的時候:
1)實例化前,先檢查模板代碼本身,查看語法錯誤等,如遺漏分號等;
2)在實例化期間,檢查模板代碼,查看是不是所有的調用都有效。如該實例化類型不支持某些函數的調用。
3.顯示指定模板參數
模板參數不支持自動類型轉換,每個T都必須准確的匹配。
template <typename T> inline T const7 max(T const& a, T cosnt& b); ... max(4,7) //OK max(4,4.2) //ERROR,第一個是int,第二個是double
有幾種解決辦法,
1)max(static_cast(double)(4),4.2) //OK
2)顯示指定模板參數:
max<double>(4,4.2)
3)使用連個模板參數。
4.重載函數模板
和普通函數一樣,模板函數同樣可以被重載,相同的函數名稱可以具有不同的函數定義。
幾條基本的原則:
1)非模板函數和一個同名的模板函數可以同時存在。對於非模板函數和同名的函數模板,如果其他條件都相同的話,在調用的時候將調用非模板函數,不會實例化模板函數。
2)如果模板產生一個更好的匹配,選擇模板參數。
3)可以顯示的指定一個空的模板實例列表,告訴編譯器,用模板來匹配。
4)函數的所有重載說明在該函數被調用位置之前。
我現在的感覺是這個功能少用,很容易出問題,以後就不知道了。
如果編寫程序時,我們用到了重復的函數,在進行重復性的工作,那麼我們可以通過調用模板類減少重復的工作
#include <iostream>
using namespace std;
template<typename T>
class CNode
{
public:
CNode();
private:
T m_data;
};
template<typename T>
CNode<T>::CNode()//!!!問題在這裡
{
m_data = 100;
}
void main()
{
CNode<int> a;
}
C2955的其中的一個說明,就是說這個問題
C2955 can also occur when attempting an out-of-line definition for a function declared in a class template: