c++模板和头文件
c++ template and header files
所以,我听说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文件中实例化,那么您可以在那里定义它。当一个类有一个作为模板的私有成员函数时,有时会发生这种情况(它只从实现文件中调用,而不是从类头文件中调用(。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到