模板宣告與定義要放在同一檔案中?

2021-06-21 11:32:47 字數 796 閱讀 9231



「通常情況下,你會在.h檔案中宣告函式和類,而將它們的定義放置在乙個單獨的.cpp檔案中。但是在使用模板時,這種習慣性做法將變得不再有用,因為當例項化乙個模板時,編譯器必須看到模板確切的定義,而不僅僅是它的宣告。因此,最好的辦法就是將模板的宣告和定義都放置在同乙個.h檔案中。這就是為什麼所有的stl標頭檔案都包含模板定義的原因。」[1]

"標準要求編譯器在例項化模板時必須在上下文中可以檢視到其定義實體;而反過來,在看到例項化模板之前,編譯器對模板的定義體是不處理的——原因很簡單,編譯器怎麼會預先知道 typename 實參是什麼呢?因此模板的例項化與定義體必須放到同一翻譯單元中。"[1]

"《c++程式設計思想》第15章(第300頁)說明了原因:

模板定義很特殊。由template<…> 處理的任何東西都意味著編譯器在當時不為它分配儲存空間,它一直處於等待狀態直到被乙個模板例項告知。在編譯器和聯結器的某一處,有一機制能去掉指定模板的多重定義。所以為了容易使用,幾乎總是在標頭檔案中放置全部的模板宣告和定義。"[2]

"對c++編譯器而言,當呼叫函式的時候,編譯器只需要看到函式的宣告。當定義類型別的物件時,編譯器只需要知道類的定義,而不需要知道類的實現**。因此,因該將類的定義和函式宣告放在標頭檔案中,而普通函式和類成員函式的定義放在原始檔中。

但在處理模板函式和類模板時,問題發生了變化。要進行例項化模板函式和類模板,要求編譯器在例項化模板時必須在上下文中可以檢視到其定義實體;而反過來,在看到例項化模板之前,編譯器對模板的定義體是不處理的——原因很簡單,編譯器怎麼會預先知道 typename 實參是什麼呢?因此模板的例項化與定義體必須放到同一翻譯單元中。

"[3]

模板宣告與定義要放在同一檔案中?

通常情況下,你會在.h檔案中宣告函式和類,而將它們的定義放置在乙個單獨的.cpp檔案中。但是在使用模板時,這種習慣性做法將變得不再有用,因為當例項化乙個模板時,編譯器必須看到模板確切的定義,而不僅僅是它的宣告。因此,最好的辦法就是將模板的宣告和定義都放置在同乙個.h檔案中。這就是為什麼所有的stl標...

模板宣告與定義要放在同一檔案中

通常情況下,你會在.h檔案中宣告函式和類,而將它們的定義放置在乙個單獨的.cpp檔案中。但是在使用模板時,這種習慣性做法將變得不再有用,因為當例項化乙個模板時,編譯器必須看到模板確切的定義,而不僅僅是它的宣告。因此,最好的辦法就是將模板的宣告和定義都放置在同乙個.h檔案中。這就是為什麼所有的stl標...

模板函式的定義和宣告須在同一檔案內

按照c 中 的慣例,類宣告在h檔案中,類定義在cpp檔案中,相應的成員函式宣告也在h檔案中,定義在cpp檔案中。但是如果這樣的架構用在模板函式中,在呼叫模板函式的地方鏈結器便會報錯,error lnk2001 unresolved external symbol。將定義寫在與宣告相同的檔案中問題解決...