[英]Elegant solution to implementing c++ templates
受這個2009 年問題的啟發
背景:我目前正在研究一個小型 c++ 項目,並決定嘗試創建自己的模板類。 我立即遇到了十幾個 linker 錯誤。
就目前而言,我的理解是模板特化只有在絕對需要時才會生成,這意味着模板化 class 的實現必須是內聯的,或者在底部伴隨一個顯式實例化。 (為什么一個暗示另一個我不太確定)
問:為什么會這樣? 如果模板在單獨的.cpp
文件中實現,編譯順序是否有什么特別之處,使得編譯器無法按需實例化模板? 在我看來,header 和實現只是簡單地附加在一起。
此外,我上面鏈接的問題最初是在十多年前發布的,一些評論指出提到的 c++-faq 引用已經過時,所以我想知道新標准是否支持同時啟用單獨的頭文件/實現文件和隱式實例化。
為什么會這樣? 由於模板在第一階段編譯器通過兩個階段進行編譯,因此主要檢查語法錯誤。 如果在你的模板中沒有發現錯誤是合法使用的,但是在這個階段編譯器不會為它生成任何代碼。 在第二階段,編譯器將為您使用的模板化函數的所有 class 成員 function 生成代碼。
因為模板是在編譯時評估的。 那么當編譯器編譯它時會發生什么? 例如,如果您在templated.hpp
文件中定義了一個模板,並在implementation.cpp
文件中定義了它的實現。 編譯器將每個文件分別編譯成 object,然后 linker 將它們鏈接在一起。 由於模板是在編譯時評估的,因此編譯器需要在編譯時實現它,如果您將它放在不同的實現文件中,這是不可用的。 所以鏈接器向您抱怨我無法為您的此模板找到類型 T 的實現。 這一切都發生在編譯時。
到目前為止,直到 C++20 甚至 C++23 模板仍然需要在編譯時進行評估,盡管 C++ 添加了新的概念modules
,我不確定它是否可以這樣使用,但你可以在這里閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.