簡體   English   中英

在模板頭文件的末尾包含.cpp

[英]Including .cpp at end of template header file

我正在閱讀一本較舊的數據結構書,它說當你進行模板類編程時,你應該在.h文件的末尾包含.cpp。

據我所知,您必須在.h文件中為任何模板類成員函數執行完整的函數實現 - 這是由於模板編譯器的工作方式。

我教過的唯一函數可以放在模板類的實現文件中,模板專用函數即: template<> Class<Type>::function_name()

為什么這本書建議在.h結束時包含.cpp? 這只是一種將實現分離到不同文件,同時讓它們用標題編譯的方法嗎? 如果是這樣,你會在哪里放置真正的專業 - 我猜他們不能進入標題所包含的.cpp。

很可能作者更喜歡在不同的文件中使用聲明和定義,我猜這是因為它可以更容易地在聲明和定義之間跳轉。

但是“cpp”文件擴展名有點令人困惑。 通常這些文件被稱為“內聯C ++”的“ipp”。

這可能是古老的說法,我認為您對實施和聲明分離的分析是正確的。 回到編寫這本特定的書時,作者可能認為cpp文件是定義所在的文件,h文件是聲明所在的文件。 由於重復的定義,將真正的顯式特化放入前一個文件中對鏈接器來說自然是致命的(或至少是無用的)。 如今,我會避免命名定義文件.cpp。

首先,沒有規則必須在.h (或.hpp.hh )文件中具有模板的實現; 事實上,除了最簡單的模板之外,我建議不要這樣做。 無論文件如何,您都必須包含實現。 作者可能想到的是將實現放在.cpp文件中,並包含它。 但是,我建議找一個不同的名字,因為大多數人(以及一些IDE)會認為你應該編譯所有的.cpp文件。 一個常見的約定,其中.cc.hh是源和頭文件的通常擴展名,是.tcc用於模板實現; 在Windows世界中( .cpp幾乎是通用的),我推薦像.tpp這樣的.tpp

請注意,最早的模板實現要求實現在.cpp 但是,這些實現不需要(或允許)包含它; 編譯器搜索與模板類定義或函數聲明出現的.hpp (或.hh )文件相對應的.cpp (或.cc ),並生成包含它的虛擬源文件(以及其他任何必要的文件) )。

據我所知,您必須在.h文件中為任何模板類成員函數執行完整的函數實現 - 這是由於模板編譯器的工作方式。

可能是本書假設您在.cpp文件中具有完整的功能實現。

如果完全特化是在cpp文件中,則它們不應包含在頭文件中。 如果你這樣做,很可能它不會編譯。 因為編譯器會看到與頭文件相同功能的多個定義通常會包含在多個源文件中。

如果要使用模板,則必須在實例化模板的TU中顯示整個模板定義。 因此,您可以簡單地將完整定義放在頭文件中。

只有當你真的想要將類定義和類成員函數體分開時 ,才可能將這些函數定義放在一個單獨的文件中。 但是,上述規則仍然適用,因此您必須將單獨的文件與標題一起包含在內,以便任何人都能夠使用該模板。

這是一個品味問題。 如果成員函數體很短,您也可以將它們內聯定義。 還要記住,在類定義中定義的函數是內inline隱式聲明的,而如果單獨編寫inline ,則必須明確指定。

部分專門化的模板仍然是模板,因此適用相同的規則。

一個完全專業化的類模板只是一個普通的類,所以你這樣對待:

// FooInt.hpp
template <typename> class Foo;
template <> class Foo<int>
{
  // your class here
};

您可能想到的一件事是“顯式模板實例化”,la template class Foo<int>; 那是另一回事; 如果您對使用它感興趣,請發表評論。

暫無
暫無

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

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