模板類的定義和實現必須要在同乙個檔案中,通常是標頭檔案,編譯器要看到模板實現才能展開模板。
因為初始化乙個模板,編譯器根據模板的引數建立乙個新的類。比如:
templatestruct foo};
// somewhere in a .cpp
foof;
編譯器在解析到這段**時,會建立乙個新類,等價於:
struct fooint}
當編譯器需要訪問方法實現時,用模板引數去例項化他們時,比如這個情況下是int。如果實現不在標頭檔案,方法是訪問不到的,那樣編譯器就不能例項化那個模板。常用的方法是,在標頭檔案中宣告模板,在乙個模板檔案中實現那些類。然後在標頭檔案的尾部包含具體實現的檔案。例如
// foo.htemplate struct foo;
#include "foo.tpp"
// foo.tpptemplate void foo::dosomething(t param)
這樣,實現和宣告是分開的,編譯器也能訪問到。
C 內聯函式為什麼定義在標頭檔案中?
最近從新撿起c 突然有乙個想法,為什麼內聯函式的會在標頭檔案中申明和定義。如果是c 新手,對申明和定義這兩個詞比較陌生,那麼我先解釋一下申明和定義的意思 原諒我廢話多 為什麼需要內聯函式?函式呼叫包含一系列工作,例如儲存暫存器,並在返回時恢復,可能需要拷貝實參,程式轉向乙個新的位置執行等,這些工作會...
為什麼模板函式的定義也要在標頭檔案裡
對於模板,最重要的一點,就是在定義它的時候,編譯器並不會對它進行編譯,因為它沒有乙個實體可用。只有模板被具體化 specialization 之後 用在特定的型別上 編譯器才會根據具體的型別對模板進行編譯。所以才定義模板的時候,會發現編譯器基本不會報錯,也做不出智慧型提示。但是當它被具體用在乙個類上...
const物件為什麼可以在標頭檔案中定義
對於標頭檔案中為什麼可以定義const變數 或物件 以及推薦用const代替 define巨集定義,之前一直概念不清晰,今天就總結一下。之前在網上查過,解釋的都不太到位,或者角度不一樣 從編譯原理 強弱定義?總之不能清晰理解,發現 c primer 上基本上涵蓋了所有平常遇到的c c 問題,而且 c...