我知道模板函數必須在頭文件中定義,由於某種原因我忘了。但是我相信非模板函數,即使它們屬於模板類,也可以在.cpp文件中定義。這是允許的嗎?如果不是,爲什麼不呢?謝謝:).cpp文件中模板類的非模板方法 - 未定義的引用?
回答
實際上,必須在頭文件/使用點定義什麼(除非在其他地方發生明確的實例化),都是「模板化實體」。到目前爲止,在C++中沒有這樣的術語,但提案正在將其添加到語言中,因爲許多規則適用於「模板化實體」,而不僅僅適用於模板。
見http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0391r0.html
的原因應該是顯而易見的。就像模板一樣,模板的成員可以使用模板參數,所以它們的源必須可用於實例化。
解決此問題的類(如果成員函數不使用模板參數)的訣竅是將函數放在非模板基類中,並從類模板繼承該類。
感謝您的幫助。所以基本上不可能在.cpp中實現一個不使用模板類型的非模板成員函數,也不是因爲編譯器缺少必需的信息,而僅僅是因爲C++的限制,對吧? – Virus721
我認爲這不僅是因爲這一點。但是由於編譯器在編譯cpp文件時無法與模板類mmeber的用戶進行通信,即該函數沒有「使用模板參數」並已被編譯。呼叫站點上的用戶需要知道這一點,以便以不同的方式調用此函數(即不使用包含模板參數編碼等的符號名稱)。然後,當這種功能被認爲是使用這些參數的時候,有什麼規則需要用語言來表述。是否使用「這個」計數? –
- 1. 非模板類的模板方法
- 2. 未定義引用類模板下面
- 3. 非模板錯誤的模板定義
- 4. C++從類本身的非模板類調用模板方法
- 5. 派生類中定義的頭文件和定義模板,以CPP文件
- 6. 未定義的模板方法技巧?
- 7. 超出模板類中模板方法的聲明模板定義
- 8. 實例化模板化類的非模板化非模板化方法
- 9. 模板 - 未定義的引用錯誤
- 10. 對C++模板方法的函數未定義的引用
- 11. 模板類型未定義
- 12. 非模板類中的函數模板
- 13. 模板類中的靜態非模板方法
- 14. 模板類方法的特化。 「功能模板已經定義」
- 15. 在模型中引用自定義方法的模板變量
- 16. 模板在cpp
- 17. 如何定義模板類的模板
- 18. 在cpp中定義模板專業化?
- 19. 如何* .INL文件模板類中定義模板功能
- 20. 未定義模板
- 21. 未定義引用模板函數
- 22. C++中,非模板類模板變量
- 23. C++對使用模板的類的未定義引用
- 24. 用於定義模板模板類成員的語法
- 25. cpp中的模板函數
- 26. 未定義的方法`MODEL_NAME」的NilClass:以局部模板類和
- 27. 從非模板參數化方法返回模板類型
- 28. 方法已經定義(模板類)
- 29. 非法使用模板中的類型
- 30. 使用模板的C++方法定義
Uhm,模板類的全部都是模板,即使它不顯示在方法簽名或方法的代碼中;因爲即使類佈局通常依賴於模板參數(所以模板參數未出現的方法的生成代碼在不同的模板實例化之間可能會有所不同),因此定義何時允許「挑選」單個方法只會添加標準更混亂的規則。將所有模板不變的東西移動到基類的簡單解決方案似乎是更好的選擇。 –