程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++學習筆記36 模版的顯式具體化(template specialization)和顯式實例化(template instantiation)

C++學習筆記36 模版的顯式具體化(template specialization)和顯式實例化(template instantiation)

編輯:C++入門知識

C++學習筆記36 模版的顯式具體化(template specialization)和顯式實例化(template instantiation)


C++的模版有時候很可能無法處理某些類型。

例如:

#include 
using namespace std;
class man{
private:
	string name;
	int data;
public:
	man(string s,int i):name(s),data(i){
	}
	void show()const{
		cout<<"this name is "<編譯結果:

\
可以看到會出現很多錯誤。(雖然這不是重點。)<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+vNnJ6M7Sz6PN+21Td2Fw1rvKx727u7vBvbj2bWFutcRkYXRho6y2+G5hbWW7ubGjs9bT69StwLTSu9H5oaO4w9T1w7TX9sTYo788L3A+CjxwPjwvcD4KPHA+1eK49sqxuvKjrL7N0OjSqs7Sw8fOqszYtqi1xMDg0M3M4bmpvt/M5buvtcTEo7DmtqjS5cHLoaM8L3A+CjxwPr7fzOW7r7D8wKjP1Mq9vt/M5buv0tS8sNL+yr3KtcD9u6+6zc/Uyr3KtcD9u6+hozwvcD4KPHA+PGJyPgo8L3A+CjxwPjEuz9TKvb7fzOW7r7XE1K3QzbrNtqjS5dOm0tR0ZW1wbGF0ZTw+v6rNt6OssqLNqLn9w/uzxsC01riz9sDg0M2hozwvcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">template<> void mSwap(man &m1,man &m2)

或者

template<>
void mSwap(man &m1,man &m2)

修改後的例子:

#include 
using namespace std;
class man{
private:
	string name;
	int data;
public:
	man(string s,int i):name(s),data(i){
	}
	void show()const{
		cout<<"this name is "<
void mSwap(man &m1,man &m2){
	int temp=m1.getData();
	m1.setData(m2.getData());
	m2.setData(temp);
	cout<<"Here are the man version,successed!"<運行截圖:


這就是模版顯式具體化的作用了。

需要注意的是,具體化優先於常規模版,而非模版函數優先於具體化和常規模版。


2.實例化

要進一步了解模版,必須理解術語實例化和具體化。記住,在代碼中包含函數模版本身並不會生成函數定義,它只是一個用於生成函數定義的方案。編譯器使用模版為特定類型生成函數定義時,得到的是模版實例,例如,上面的mSwap(i,j),函數調用mSwap(i,j)導致編譯器生成mSwap()的一個實例,該實例使用int類型。

模版並非是函數定義,但使用int的模版實例是函數定義。這種實例化方式被稱為隱式實例化。

C++還可以顯式實例化。

語法為,聲明所需的種類--用<>符號指示類型,並在聲明之前加上關鍵字template:

templata void mSwap(man &,man &)

該聲明的意思是“使用mSwap()模版生成man類型的函數定義”。




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