c ++模板和头文件

c++ template and header files

本问题已经有最佳答案,请猛点这里访问。

所以,我听说C++模板不应该被分成头(.h)和源(.cp)文件。

例如,这样的模板:

1
2
3
4
5
template <class T>
class J
{  
   T something;
};

这是真的吗?为什么会这样?

如果因为这个原因,我必须将声明和实现放在同一个文件中,我应该将它放在.h文件还是.cpp文件中?


标题。

这是因为模板是在编译时实例化的,而不是链接时,不同的翻译单元(大致相当于您的.cpp文件)在链接时只"了解"彼此。在编译时,报头往往被广泛地"了解",因为您在任何需要报头的翻译单元中都要使用报头cx1〔2〕。

阅读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文件中实例化,则可以在其中定义它。当一个类有一个私有成员函数(它是一个模板)时,有时会发生这种情况(它只从实现文件调用,而不是从类头文件调用)。