C++頭文件中的模板類


C++頭文件中的模板類

這已經是我的第三篇關於頭文件的博客了,沒想到我還是踩了個巨坑。

大家都知道要在頭文件里聲明類成員,在源文件中實現。

但是今天寫數據結構作業,在頭文件(Stack.h)定義了一個棧的模板類,在源文件(Stack.cpp)實現了相應的功能。但是編譯死活不過,怎么改怎么過不了。

結果發現,模板類不能只在頭文件里聲明,必須在頭文件里實現。

是不可能只在單獨的cpp文件中編寫模板類實現並進行編譯的。如果有人說可以,那么肯定是模仿單獨cpp文件使用的辦法。實際上,如果打算編寫模板類庫並作為頭文件導入,且隱藏實現,這根本不可能。

為什么?

因為頭文件從不編譯,只會進行預處理。然后將預處理完的代碼與對應的、實際編譯的cpp文件合並。C++中每一個對象所占的空間大小,是編譯的時候就確定了。在模板類沒有傳入數據類型的時候,編譯器無法知道該模板類的對象所占用的空間大小。

所以在預處理完的頭文件和源文件結合的過程中,編譯器是完全不知道源文件中模板類的空間大小的,但是它需要編譯源文件。所以它無法編譯下去。

所以記住,只有模板類真正被使用的時候,編譯器才知道模板傳入的是什么類型,需要分配多少空間。

模板類的實現,如果脫離了具體的數據類型,是絕對不可能單獨編譯的。更不用說在頭文件中聲明,在源文件中實現這種不可取的方法了。

所以模板類的實現必須全部寫在頭文件里!

當然了,也可以現在頭文件的類內部聲明,在花括號外面實現。

除非,你想在主文件中,打出 #include "xxxx.cpp"的神奇操作。


免責聲明!

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



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