簡體   English   中英

非模板類與模板類的多個定義

[英]Multiple definitions of a non-template class vs. a template class

為什么編譯器抱怨在多個.cpp文件中定義的非模板類,但是對於模板類來說很好,其定義在各種.cpp文件中重復(通過包含類的.inl文件),即使class是否在多個.cpp文件中顯式實例化?

非模板情況是因為在那種情況下,您的程序違反了一個定義規則,因此鏈接器(而不是編譯器)會抱怨多個定義。

另一方面,對於模板,該語言指定這必須起作用,鏈接器會指出要做什么。 我不是100%確定是否應該將顯式模板實例化視為非模板函數。

模板函數是內聯的,只要每個定義相同,就允許在多個編譯單元中定義內聯函數。

所有編譯器總是抱怨嗎? 我從來沒有見過一個做過的,標准不允許它:只要所有定義都相同,你就可以在每個翻譯單元中定義一個類或模板一次。 實際上,您需要在每個使用它的翻譯單元中定義該類,使其成為一個完整的類型。 C ++沒有任何將類定義導出到其他翻譯單元的機制。

你確定你沒有把功能混淆。 除非是內聯函數,否則不允許多次定義函數。 您仍然需要在每個使用它的翻譯單元中定義一個函數模板,並且相同的規則適用於函數模板以及類和類模板。

請注意,如果違反這些規則,通過在多個轉換單元中定義函數,或者類或模板的定義不是標記相同的(在預處理之后,包括名稱綁定),那么您將具有未定義的行為。 編譯器(實際上是鏈接器)可能會抱怨它,但它不是必需的:大多數抱怨函數的多個定義,但我不知道在轉換單元之間類或模板定義不同時會有什么抱怨。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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