1. 程式人生 > >C++模板中宣告和定義是否可以分開存放在.h和.cpp檔案中

C++模板中宣告和定義是否可以分開存放在.h和.cpp檔案中

        雖然我們遇到的絕大多數情況下,模板中函式的宣告和定義都放在標頭檔案中,但我想肯定有人和我一樣,想知道是否可以分開存放。動手實驗後,會發現有的可以,有的會報錯,其實,這和編譯器有關。

        要弄清楚這個問題,首先要解決兩個問題。

        第一,為什麼要把函式的宣告放在標頭檔案中,而定義放在.cpp檔案中? 除了隱藏程式碼之外,如果將函式的定義也放入標頭檔案中,那麼每個include了這個標頭檔案的檔案都會對該函式定義一遍,而如果該函式又是外部連線的,那麼就會發生多重定義錯誤。

        第二,模板實現的機制是什麼?我們可以把模板想象成一個在編譯期間、而非預處理期間進行替換的大型巨集。這樣,要進行替換,就必須清楚的知道函式的定義。而如果分開存放,編譯器就很難在編譯期間獲得函式定義。

        這樣,對於模板,我們似乎處於一個兩難的境地。如果都放入標頭檔案,就會面臨多重定義;而分開存放,又會面臨連線困難。事實上,編譯器和聯結器處理前者要比處理後者容易的多。所有的編譯器和聯結器都有相應的機制來處理多重定義問題,故一般將模板宣告和定義都放在標頭檔案中。

        實際上,多數編譯器也是有處理後者的機制,也可以將宣告和定義分開。但有的編譯器會報錯。如果一定要分開,先檢視你的編譯器說明文件,看看是否支援。但推薦都放入標頭檔案。