=================編譯器處理函數(shù)模板的方法:實(shí)例化模板函數(shù)====================
C++的編譯器在遇到一個(gè)函數(shù)模板的時(shí)候,它首先要做的是確定該函數(shù)的參數(shù),這就叫做把一個(gè)函數(shù)模板修改成一個(gè)具有具體參數(shù)的函數(shù)。這種方法一般而言是隱式轉(zhuǎn)換的,我們一般是看不見的,但是C++也提供了一種顯示轉(zhuǎn)換的方法,如下:
template void Swap< int >( int &a, int &b); |
這就是實(shí)例化模板函數(shù)的聲明,上面這個(gè)式子把Swap()函數(shù)實(shí)例化為一個(gè)接受整型變量的函數(shù)。它與具體化函數(shù)模板不同之處在于:
void Swap( int &x, int &y); |
這就表示編譯器根據(jù)最初的函數(shù)模板Swap()生成了一個(gè)關(guān)于該Swap()函數(shù)的實(shí)例,這個(gè)過程就叫實(shí)例化模板函數(shù)。
通過上面的比較我們就可以清楚的看出來,具體化函數(shù)模板其實(shí)是一個(gè)有針對(duì)性的構(gòu)思,而實(shí)例化模板函數(shù)卻是一個(gè)行為,一個(gè)真真切切的動(dòng)作。編譯器會(huì)根據(jù)我們定義的模板在最終生成一個(gè)實(shí)例化之后的模板函數(shù),我們就把這個(gè)由函數(shù)模板生成的函數(shù)叫做模板實(shí)例。而模板的定義在編譯前是不會(huì)生成這樣實(shí)例化的函數(shù)的,它只用于生成該函數(shù)的一個(gè)解決方案,^_^,也就是說,它為編譯器生成一個(gè)認(rèn)為可行的思路。所以說:
p.s. 如果我們實(shí)例化模板函數(shù)之后還修改了其定義,那么編譯器就會(huì)報(bào)錯(cuò),程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <iostream> using namespace std; struct people { char name[10]; int age; }; template < class ElementType> void Swap(ElementType &a,ElementType &b) { ElementType temp; temp=b; b=a; a=temp; } //template<>void Swap<people>(people &a,people &b) void Swap<people>(people &a,people &b) { int temp; temp=b.age; b.age=a.age; a.age=temp; } int main() { int x=1,y=2; cout<< "交換之前,x=" <<x<< "\ty=" <<y<<endl; Swap(x,y); cout<< "交換之后,x=" <<x<< "\ty=" <<y<<endl; people person_1={ "unqiue" ,22}; people person_2={ "jack" ,30}; cout<< "交換之前,第一個(gè)人的名字叫:" <<person_1.name<< "\t年齡為:" <<person_1.age<<endl; cout<< "交換之前,第二個(gè)人的名字叫:" <<person_2.name<< "\t年齡為:" <<person_2.age<<endl; Swap(person_1,person_2); cout<< "調(diào)用具體化為people的Swap()函數(shù)的結(jié)果:" <<endl; cout<< "交換之后,第一個(gè)人的名字叫:" <<person_1.name<< "\t年齡為:" <<person_1.age<<endl; cout<< "交換之后,第二個(gè)人的名字叫:" <<person_2.name<< "\t年齡為:" <<person_2.age<<endl; return 0; } |
生成的錯(cuò)誤指向19行,錯(cuò)誤內(nèi)容就是““Swap”: 非法使用顯式模板參數(shù)”。
聯(lián)系客服