程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 類模板的使用,類模板使用

C++ 類模板的使用,類模板使用

編輯:C++入門知識

C++ 類模板的使用,類模板使用


 從事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)函數的所有重載說明在該函數被調用位置之前。

我現在的感覺是這個功能少用,很容易出問題,以後就不知道了。


C 中為何用模板類

如果編寫程序時,我們用到了重復的函數,在進行重復性的工作,那麼我們可以通過調用模板類減少重復的工作
 

類模板的使用問題 報錯: error C2955: “CNode” : 使用類模板需要模板

#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:
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved