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