c++ template and header files
本问题已经有最佳答案,请猛点这里访问。
所以,我听说C++模板不应该被分成头(.h)和源(.cp)文件。
例如,这样的模板:
1 2 3 4 5 | template <class T> class J { T something; }; |
这是真的吗?为什么会这样?
如果因为这个原因,我必须将声明和实现放在同一个文件中,我应该将它放在.h文件还是.cpp文件中?
标题。
这是因为模板是在编译时实例化的,而不是链接时,不同的翻译单元(大致相当于您的
阅读https://isocpp.org/wiki/faq/templates了解更多信息。
不能将模板类放入.cpp文件中的原因是,为了"编译"一个.cpp文件,您需要知道正在使用的类型,而不是t。因为模板类(如类j)没有足够的信息来编译。因此,它必须全部在报头中。
如果要将实现分解为另一个文件以保持清洁,最佳做法是使用.hxx文件。这样:在头文件j.h中,输入:
1 2 3 4 5 6 7 8 | #ifndef _J_H__ #define _J_H__ template <class T> class J{ // member definitions }; #include"j.hxx" #endif // _J_H__ |
然后,在J.HXX你会
1 2 3 4 5 6 7 | template <class T> J<T>::J() { // constructor implementation } template <class T> J<T>::~J() { // destructor implementation } template <class T> void J<T>::memberFunc() { // memberFunc implementation } // etc. |
最后,在使用模板类的.cpp文件中,让我们称之为k.cpp,您将拥有:
1 2 3 4 5 | #include"J.h" // note that this always automatically includes J.hxx void f(void) { J<double> jinstance; // now the compiler knows what the exact type is. } |
是的,这是真的。声明和实现一般都放在头文件中。一些编译器使用EDCOX1的0个关键字来进行测试,这些关键字可以让它们分开,但是已经从C++0x中删除了。
如果需要模板代码供其他翻译单元(.cpp文件)使用,则需要将实现放在.h文件中,否则这些其他单元将无法实例化模板(根据它们使用的类型展开模板)。
如果模板函数仅在一个.cpp文件中实例化,则可以在其中定义它。当一个类有一个私有成员函数(它是一个模板)时,有时会发生这种情况(它只从实现文件调用,而不是从类头文件调用)。