簡體   English   中英

實施 c++ 模板的優雅解決方案

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM