c++模板和头文件

c++ template and header files

本文关键字:文件 c++      更新时间:2023-10-16

所以,我听说C++模板不应该分为头文件(.h(和源文件(.cpp(。

例如,像这样的模板:

template <class T>
class J
{   
   T something;
};

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

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

标题。

这是因为模板在编译时实例化,而不是在链接时实例化,并且不同的翻译单元(大致相当于.cpp文件(在链接时只"了解"彼此。标头往往在编译时被广泛"了解",因为您可以在任何需要它们的翻译单元中#include它们。

读取https://isocpp.org/wiki/faq/templates了解更多信息。

不能将模板类放入.cpp文件的原因是,为了"编译".cpp文件,您需要知道正在使用什么类型来代替t。目前,模板类(如类J(没有足够的信息来编译。因此,它必须全部在标题中。

如果您希望将实现分解为另一个文件以保持清洁,最佳实践是使用.hxx文件。像这样:在你的头文件里,J.h,放:

#ifndef _J_H__
#define _J_H__
template <class T> class J{  // member definitions };
#include "j.hxx"
#endif // _J_H__

然后,在j.hxx,你会有

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,您将拥有:

#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.
}

是的,这是真的。声明和实现通常一起放在头文件中。一些编译器尝试使用export关键字来分隔它们,但该关键字已从C++0x中删除。查看此常见问题条目以了解所有肮脏的详细信息。

如果您需要其他翻译单元(.cpp文件(可以使用模板代码,则需要将实现放在.h文件中,否则这些其他单元将无法实例化模板(根据使用的类型进行扩展(。

如果您的模板函数只在一个.cpp文件中实例化,那么您可以在那里定义它。当一个类有一个作为模板的私有成员函数时,有时会发生这种情况(它只从实现文件中调用,而不是从类头文件中调用(。