1. 程式人生 > >c++類的模板成員函式申明和實現必須放在一起

c++類的模板成員函式申明和實現必須放在一起

解釋如下:

C++中每一個物件所佔用的空間大小,是在編譯的時候就確定的,在模板類沒有真正的被使用之前,編譯器是無法知道,模板類中使用模板型別的物件的所佔用的空間的大小的。只有模板被真正使用的時候,編譯器才知道,模板套用的是什麼型別,應該分配多少空間。這也就是模板類為什麼只是稱之為模板,而不是泛型的緣故。

既然是在編譯的時候,根據套用的不同型別進行編譯,那麼,套用不同型別的模板類實際上就是兩個不同的型別,也就是說,stack<int>和stack<char>是兩個不同的資料型別,他們共同的成員函式也不是同一個函式,只不過具有相似的功能罷了。

如上圖所示,很簡短的六行程式碼,用的是STL裡面的stack,stack<int>和stack<char>的預設建構函式和push函式的入口地址是不一樣的,而不同的stack<int>物件相同的函式入口地址是一樣的,這個也反映了模板類在套用不同型別以後,會被編譯出不同程式碼的現象。

所以模板類的實現,脫離具體的使用,是無法單獨的編譯的;把宣告和實現分開的做法也是不可取的,必須把實現全部寫在標頭檔案裡面。為了清晰,實現可以不寫在class後面的花括號裡面,可以寫在class的外面。