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顯示具體化的原型和定義應以template<>打頭,並通過名稱來指出型別。namespace
std;
template
void swap(t &t1,t &t2);
template void swap(int &t1,int &t2);
intmain()
template
void swap(t &t1,t &t2)
顯式具體化優先於常規模板,而非模板函式優先於具體化和常規模板
與顯式例項化不同的是,顯式具體化使用下面的宣告方式 ,兩種方式是一樣的
template<> void swap(job &c1,job &c2);這們的意思是不要使用swap()模板來生成函式定義,而使用專門的job型別顯式地定義函式定義template
<> void swap(job &c1,job &c2);
顯式具體化宣告在關鍵字template 後加<>,顯式例項化沒有
具體化小例子
#includeusingnamespace
std;
struct
job;
template
void swap(t &t1,t &t2);
template
<> void swap(job &c1,job &c2);
void
show(job j);
intmain()
; 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();
}template
void 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...
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...