Templates 模板,仅在头文件中编码?

Templates 模板,仅在头文件中编码?,templates,header-files,Templates,Header Files,最近我了解到,如果我想使用模板,我应该只在头文件中实现代码。我知道在.h和.cpp文件中有这样做的解决方案,但假设我不想这样做,我应该在.h文件中编写所有代码吗?即使程序可能很大,它也是编写代码的好方法吗?此外,只有.h文件(不包括主函数)而从不使用.cpp文件看起来很奇怪。将声明和接口文档从实现中分离出来,就像通常使用头文件(*.h)和源文件(*.cpp)一样由于C++编译过程,模板强>通常不强> 在编译过程中,所有头文件都只包含在从中调用它们的源文件中,然后独立处理这些源文件,最后将所有生

最近我了解到,如果我想使用模板,我应该只在头文件中实现代码。我知道在.h和.cpp文件中有这样做的解决方案,但假设我不想这样做,我应该在.h文件中编写所有代码吗?即使程序可能很大,它也是编写代码的好方法吗?此外,只有.h文件(不包括主函数)而从不使用.cpp文件看起来很奇怪。

将声明和接口文档从实现中分离出来,就像通常使用头文件(
*.h
)和源文件(
*.cpp
)一样由于C++编译过程,模板<>强>通常不强>

在编译过程中,所有头文件都只包含在从中调用它们的源文件中,然后独立处理这些源文件,最后将所有生成的目标文件链接到一个可执行文件中。模板是用于泛型数据类型的函数,这些泛型数据类型仅针对调用它们的数据类型进行实例化。这意味着模板函数不会创建任何代码,只要它不是由具有有效模板参数的人实例化的。无论如何,您必须确保使用访问模板函数的所有源文件所需的数据类型实例化模板

  • 如果将声明放在头文件中,并将实现放在源文件中(就像通常对函数所做的那样),则只有在该特定源文件中已知的那些版本才会被实例化。这意味着需要不同参数集的任何其他源文件可能会导致链接器错误,因为它不知道源文件不包含正确的模板参数组合,因此无法移植
  • 可以这样做,以减少开销,但通常这会使您失去很多灵活性,因为您必须事先定义哪些模板参数将在其他翻译单元中使用
  • 最后,您可以简单地将声明和实现保留在头文件中。这会减慢编译过程,因为头的所有内容都必须粘贴到调用它的所有源文件中。因此,有些人不喜欢像这样的大量模板库,但它为您提供了最大的灵活性。但是,这种效果可以通过以下功能来减少。为了使其更易于阅读,一些库将声明(和文档)从实现中分离出来,将声明放在
    *.h
    文件中,并在
    *.hpp
    -文件中定义实现(类似于
    *.cpp
    ,)
因此,通常这取决于用法:如果您知道特定模板函数仅在特定源文件中使用,则可以将文档、声明和实现放入源文件(而不是标头)。如果要与多个源文件共享模板函数,请将声明和实现放在头中。这通常是标准方法,因为它是最灵活的。如果您编写了一个完全模板化的库,那么将
*.h
文件中的声明和文档与
*.hpp
文件中的实现分离可能是最有意义的,但主要是为了有一个更简单的概述。无论如何,对于某些函数,在声明和实现之间没有明确的分离是完全正常的,因此某些头文件可能缺少相应的源文件