C++類模板聲明與定義為何不能分開


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

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

如上圖所示,很簡短的六行代碼,用的是STL里面的stack,stack<int>和stack<char>的默認構造函數和push函數的入口地址是不一樣的,而不同的stack<int>對象相同的函數入口地址是一樣的,這個也反映了模板類在套用不同類型以后,會被編譯出不同代碼的現象。

所以模板類的實現,脫離具體的使用,是無法單獨的編譯的;把聲明和實現分開的做法也是不可取的,必須把實現全部寫在頭文件里面。為了清晰,實現可以不寫在class后面的花括號里面,可以寫在class的外面。

轉載自知乎 余天升


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM