例項化和具體化

2021-07-12 07:40:16 字數 1715 閱讀 4848

primer plus在解釋具體化和例項化看的有點亂,分解出來備忘

在**中包含函式模板本身並不會生成函式定義,它只是用於生成函式定義的方案

編譯器使用模板為我寫型別生成函式定義時,得到的是模板例項

如這個模板

templatevoid swap(t &t1,t &t2)

呼叫

int i = 10,j=20

; ::cout

<<"

i, j =

"<", "

cout

<<"";

swap(i,j);

::cout

<<"

now i, j =

"<", "

《呼叫 swap(i,j)導致編譯器生成swap()的乙個例項,該例項使用int型別。模板並非函式定義,但使用int的模板例項是函式定義。

這種例項化方式被稱為隱式例項化,編譯器之所以知道需要進行定義,是由於程式呼叫swap()函式時提供了int 引數。

c++還允許顯示例項化

其語法是,宣告所需的種類用<>指示型別並在宣告前加上template:

template void swap(int &t1,int &t2);

例子

#includeusing namespace std;

templatevoid swap(t &t1,t &t2);

template void swap(int &t1,int &t2);

int main()

顯示具體化的原型和定義應以template<>打頭,並通過名稱來指出型別。

顯式具體化優先於常規模板,而非模板函式優先於具體化和常規模板

與顯式例項化不同的是,顯式具體化使用下面的宣告方式 ,兩種方式是一樣的

template<> void swap(job &c1,job &c2);

template

<> void swap(job &c1,job &c2);

這們的意思是不要使用swap()模板來生成函式定義,而使用專門的job型別顯式地定義函式定義 

顯式具體化宣告在關鍵字template 後加<>,顯式例項化沒有

具體化小例子

#includeusing namespace std;

struct job

;templatevoid swap(t &t1,t &t2);

template<> void swap(job &c1,job &c2);

void show(job j);

int main()

; job sidey=;

cout<<"sue:\n";

show(sue);

cout<<"sidey:\n";

show(sidey);

swap(sue,sidey);

cout<<"sue:\n";

show(sue);

cout<<"sidey:\n";

show(sidey);

cin.get();

}templatevoid swap(t &t1,t &t2)

template<> void swap(job &j1,job &j2)

void show(job j)

例項化和具體化詳解

primer plus在解釋具體化和例項化看的有點亂,分解出來備忘 在 中包含函式模板本身並不會生成函式定義,它只是用於生成函式定義的方案 編譯器使用模板為我寫型別生成函式定義時,得到的是模板例項 如這個模板 templatevoid swap t t1,t t2 呼叫 int i 10,j 20 ...

C Primer Plus 例項化與具體化

template void swap t a,t b 函式模板 void main template void swap t a,t b template 函式模板 void swap t a,t b template void swap int int 使用swap模板顯示地生成int型別函式定義...

模板函式 例項化與具體化

首先,例項化從字面上來看就是產生乙個實際的事物。在函式模板中就是產生乙個特定的函式定義,例如有乙個swap函式 template void swap t a,t b 使用模板,並不意味著我們生成了一系列的函式定義,而是一種方案,當我們傳遞型別進入的時候才生成出對應的swap函式定義,比如現在swap...