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...