類模板(class template)是用來生成類的藍圖,它使類中的一些成員變數和成員函式的引數或返回值可以取任意的資料型別。
類模板通過關鍵字template來定義,其宣告格式為
template 《模板引數列表
>
class 類名
//使用模板引數
其中,模板引數列表的格式為「typename
引數1, typename
引數2,...
」,其中
typename
可以用class
代替。
如下,定義了乙個類模板
templateclass myclass
類模板的成員函式可以在類模板內部定義,也可以在類模板的外部定義。
在類模板myclass中定義乙個名為
findmax()
的成員函式,該成員函式的作用是返回兩個數的最大值。
在myclass類模板定義的內部,有如下函式
t findmax(t x1, t x2)
在類模板外部定義成員函式時,需要加入template關鍵字。其定義格式為
template《模板引數列表
>
返回值類名《模板參數列
>::
成員函式名
(函式引數列表)
//成員函式內容;
假設類模板myclass如「
1 類模板的宣告」中的格式,此時在
myclass
類模板的外部定義
findmax()
成員函式。
templatet myclass::findmax(t x1, t x2)
在定義類模板的物件時,必須指定模板引數的實參。
myclassmyclass;
int max = myclass.findmax(1, 2);
其中,將類模板的引數指定為int
型別,則此時定義的
myclass
是類模板
myclass
的int
版本。
假設t是乙個類模板的模板引數,當編譯器遇到類似
t::size_type
這樣的**時,它不會知道
size_type
是乙個自定義的型別還是類的靜態成員變數,直到例項化時才會知道。例如,在類模板的某個成員函式中有如下**
templatevoid myclass::myfunc()
此時,如果將size_type
看作是類的靜態成員變數,則以上語句為
size_type
乘以psize_type
;而如果將
size_type
看作是類自定義的型別,則以上語句的作用是宣告了乙個
size_type
的指標pszit_type
。在預設情況下,c++編譯器認為是第一種情況,即將
size_type
看作是類的靜態成員變數。如果希望
c++編譯器將
size_type
看作是類自定義的型別,則需要顯式地告訴編譯器該名字是乙個型別,通過
typename
來實現這一點:
templatevoid myclass::myfunc()
在msdn論壇上,有朋友給出如下**
#include "stdafx.h"
#include#include#includeusing namespace std;
templateclass myclass
;mystruct doo(t temp);
};templatemyclass::mystruct
myclass::doo(t temp)
;int main()
以上**定義了乙個類模板myclass
,在該類模板中又定義了乙個名為
doo()
的成員函式,該成員函式的返回值是
myclass
類中自定義的
mystruct
類,並且
doo()
成員函式是在
myclass
的外部進行定義的。
在vs2015中編譯該**,給出的錯誤提示是
warning c4346: 「mystruct」: 依賴名稱不是型別
error c2061: 語法錯誤: 識別符號「mystruct」
正如「4
在類模板中使用類中自定義的型別」中提到的,在定義
doo()
成員函式時,
c++編譯器將該函式的返回值
myclass::mystruct
當作了myclass
類中的成員變數,所以會有以上的錯誤提示。
那麼修改的方法就是在myclass::mystruct之前加入
typename
以提示c++
編譯器mystruct
是乙個型別而不是變數。
templatetypename myclass::mystruct
myclass::doo(t temp)
C 中的模板(類模板 模板類 模板函式)
1 class 一般class用於定義類,在模板引入c 後,最初定義模板的方法為 template,這裡class關鍵字表明t是乙個型別 2 typename 為了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字,它的作用同class一樣表明後面的符號為乙個型別...
c 中的類模板
類模板和類的概念類似之處,類是把具體物件 具有相同的屬性 抽象化,類模板是把資料型別抽象化。這樣使用類模板,我們就不必因為資料型別的微小變化而每次都定義不同的類,避免了類的重複設計。class a int getval private int val class b double getval pr...
C 中的 類模板
具體example如下 template class queue private node head int thesize public queue queue void push t val while temp next null if temp next null void print co...