解釋如下:
C++中每一個對象所佔用的空間大小,是在編譯的時候就確定的,在模板類沒有真正的被使用之前,編譯器是無法知道,模板類中使用模板類型的對象的所佔用的空間的大小的。只有模板被真正使用的時候,編譯器才知道,模板套用的是什麼類型,應該分配多少空間。這也就是模板類爲什麼只是稱之爲模板,而不是泛型的緣故。
既然是在編譯的時候,根據套用的不同類型進行編譯,那麼,套用不同類型的模板類實際上就是兩個不同的類型,也就是說,stack<int>和stack<char>是兩個不同的數據類型,他們共同的成員函數也不是同一個函數,只不過具有相似的功能罷了。
如上圖所示,很簡短的六行代碼,用的是STL裏面的stack,stack<int>和stack<char>的默認構造函數和push函數的入口地址是不一樣的,而不同的stack<int>對象相同的函數入口地址是一樣的,這個也反映了模板類在套用不同類型以後,會被編譯出不同代碼的現象。所以模板類的實現,脫離具體的使用,是無法單獨的編譯的;把聲明和實現分開的做法也是不可取的,必須把實現全部寫在頭文件裏面。爲了清晰,實現可以不寫在class後面的花括號裏面,可以寫在class的外面。
今天犯了這個錯誤,導致鏈接錯誤。下次記住了。