c++中模板類的成員函式的宣告與定義應該放在標頭檔案裡
今天嘗試自己實現vector資料結構底層,在定義vector模板類的時候,還想像往常一樣把類分為.h檔案和.cpp檔案,把成員函式的宣告放在.h檔案中,把具體實現放在.cpp檔案中,結果在測試時發現在編譯過程中報錯。除錯了很久,重視提示“無法解析的外部符號”,如圖所示:
最終我找到了原因:
引用C++primer的話:C++支援兩種模板編譯模式包含模式Inclusion Model 和分離模式Separation Model
1. 包含編譯模式
在包含編譯模式下我們在每個模板被例項化的檔案中包含函式模板的定義並且往往把定義放在標頭檔案中像對行內函數所做的那樣
2. 分離編譯模式
在分離編譯模式下函式模板的宣告被放在標頭檔案中 , 在模板定義中有一個關鍵字export, 關鍵字export 告訴編譯器在生成被其他檔案使用的函式模板例項時可能需要這個模板定義編譯器必須保證在生成這些例項時該模板定義是可見的 , 關鍵字export 不需要出現在標頭檔案的模板宣告中, 分離模式使我們能夠很好地將函式模板的介面同其實現分開進而組織好程式以便把函式模板的介面放到標頭檔案中而把實現放在文字檔案中, 但是並不是所有的編譯器都支援分離模式, 即使支援也未必總能支援得很好, 支援分離模式需要更復雜的程式設計環境所以它們不能在所有C++編譯器實現中提供.
理解: 現在的VC++編譯器都不知道模板分離編譯模式,所以還是要把定義與實現都放在一個檔案中。
再回頭看上面的例子,可以知道建構函式也是一個模板,在main.cpp中建立一個vector要建立一個建構函式模板的例項 。例項化要素體現在main.cpp檔案中,如一些函式的實參(a,b,c)。如果按照傳統方式,編譯器在vector.h檔案中看到了模板的宣告,但沒有模板的定義,這樣編譯器就不能建立vector(a,b,c)。但這時並不出錯,因為編譯器認為模板定義在其它檔案中,就把問題留給連結程式處理。 現在,編譯vector.cpp時會發生什麼問題呢?編譯器可以解析模板定義並檢查語法,但不能生成成員函式的程式碼。它無法生成程式碼,因為要生成程式碼,需要知道模板引數,即需要一個型別,而不是模板本身。這樣,連結程式在main.cpp 或 vector.cpp中都找不到vector(a,b,c)的定義,於是報出無定義成員的錯誤。
相關文章
- 模板類成員函式的定義和宣告為什麼要放在一個檔案中函式
- 類中成員函式宣告後面的const的含義!函式
- c++中模板_類别範本的宣告和定義C++
- 函式指標使用c++類成員函式函式指標C++
- C++:類的成員函式C++函式
- C++模板的定製四:定製成員函式和預設類參 (轉)C++函式
- c++智慧指標中的reset成員函式C++指標函式
- C++ 類成員函式C++函式
- C++模板的定製五:對定製成員函式的補充 (轉)C++函式
- c++中string類成員函式的總結C++函式
- 易優CMS模板標籤assign定義變數模板檔案中定義變數,可在其他標籤裡使用該變數變數
- [C++] 成員函式指標和函式指標C++函式指標
- 淺談C++指標直接呼叫類成員函式C++指標函式
- C語言中的標頭檔案中的巨集定義C語言
- 一種將函式模板定義和宣告分開的方法函式
- C++ 宣告與定義C++
- C++類將函式模板宣告為友元 例項C++函式
- C++基礎::函式、類、型別所在的標頭檔案 && 介面的介紹C++函式型別
- C++ 字元處理函式(cctype標頭檔案)C++字元函式
- 類别範本及其成員函式的定義及注意事項函式
- C++ 中的 const 物件與 const 成員函式C++物件函式
- 內部類中的成員的定義和使用
- 宣告與函式、函式指標函式指標
- algorithm標頭檔案下的常用函式Go函式
- C++標頭檔案<algorithm>中常用函式簡介C++Go函式
- C++ 字串 cctype 標頭檔案標準庫處理函式C++字串函式
- C++共享之道:用extern實現原始檔變數與類成員函式的巧妙共享C++變數函式
- C++ 類成員指標C++指標
- C++ 成員資料指標成員函式指標簡單測試C++指標函式
- C++模板的定製一:定製函式模板 (轉)C++函式
- Javascript中的迴圈變數宣告,到底應該放在哪兒?JavaScript變數
- Nt函式原型標頭檔案函式原型
- 避免標頭檔案重複定義
- mac CLion cmake 呼叫自己定義的標頭檔案Mac
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式
- 在 js 裡定義按鈕的響應函式JS函式
- C++類中的常成員和靜態成員C++
- [譯]Kotlin中是應該定義函式還是定義屬性?Kotlin函式