C++頭文件中的模板類
這已經是我的第三篇關於頭文件的博客了,沒想到我還是踩了個巨坑。
大家都知道要在頭文件里聲明類成員,在源文件中實現。
但是今天寫數據結構作業,在頭文件(Stack.h)定義了一個棧的模板類,在源文件(Stack.cpp)實現了相應的功能。但是編譯死活不過,怎么改怎么過不了。
結果發現,模板類不能只在頭文件里聲明,必須在頭文件里實現。
是不可能只在單獨的cpp文件中編寫模板類實現並進行編譯的。如果有人說可以,那么肯定是模仿單獨cpp文件使用的辦法。實際上,如果打算編寫模板類庫並作為頭文件導入,且隱藏實現,這根本不可能。
為什么?
因為頭文件從不編譯,只會進行預處理。然后將預處理完的代碼與對應的、實際編譯的cpp文件合並。C++中每一個對象所占的空間大小,是編譯的時候就確定了。在模板類沒有傳入數據類型的時候,編譯器無法知道該模板類的對象所占用的空間大小。
所以在預處理完的頭文件和源文件結合的過程中,編譯器是完全不知道源文件中模板類的空間大小的,但是它需要編譯源文件。所以它無法編譯下去。
所以記住,只有模板類真正被使用的時候,編譯器才知道模板傳入的是什么類型,需要分配多少空間。
模板類的實現,如果脫離了具體的數據類型,是絕對不可能單獨編譯的。更不用說在頭文件中聲明,在源文件中實現這種不可取的方法了。
所以模板類的實現必須全部寫在頭文件里!
當然了,也可以現在頭文件的類內部聲明,在花括號外面實現。
除非,你想在主文件中,打出 #include "xxxx.cpp"的神奇操作。