c++ - 为什么有时需要将 C++ 模板函数定义放在头文件中?

标签 c++ templates

<分区>

所以我在我的 C++ 项目中遇到链接错误,stackoverflow 帖子提到模板方法也需要在 header 而不是源文件中定义。

该特定方法的代码是(结合声明/定义后):

struct Timer {
  template <typename T>
  const long getDuration() const; 
};

template <typename T>
const long Timer::getDuration() const {
   long time = static_cast<long>(std::chrono::duration_cast<T>(end - start).count());

  return time > 0 ? time : 1L;
}

现在的解释是,对于模板,编译器需要定义才能处理它,但情况似乎并非总是如此。

例如,这段代码在我看来与上面的代码类似,但是我可以将声明放在头文件中,将定义放在源文件中:

// Enity.hpp
class Entity {
  public:
    template <typename T>
    bool hasComponent() const;
}

// Entity.cpp
template <typename T>
bool Entity::hasComponent() const {
  return componentBitSet[getComponentTypeId<T>()];
}

我对现代 C++ 还是比较陌生,所以我试图理解为什么在第一个示例中我需要在同一个文件中声明和定义,而在第二个示例中,它们可以分开。

最佳答案

Why do I sometimes need to put c++ template function definitions in header file?

因为有时(经常)您可能希望在多个翻译单元中实例化模板。

however I can place the declaration in the header file and the definition in source file

记住如何将一个文件包含到另一个文件中。预处理器只是将包含的文件复制到源文件中。

因此,如果将模板定义放在头文件中并将其包含到源文件中是正确的(事实上也是正确的),那么当然将该定义直接放入源文件 - 编译器看到的内容没有区别(预处理后)。

但请记住,模板只能在定义它的翻译单元中实例化 - 这是您解释的解释的结果。所以,如果您尝试:

// Other.cpp
#include "Enity.hpp"

struct X {};

void foo {
    Entity e;
    e.hasComponent<X>();
}

Other.cpp 以来它无法工作无法实例化 Enity::hasComponent<X>没有 Enity::hasComponent 的定义.

关于c++ - 为什么有时需要将 C++ 模板函数定义放在头文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51005529/

相关文章:

c++ - 链接器错误,即使我使用 #ifndef 阻止它们

c++ - 从类模板派生类

c++ - 将 head 设置为 NULL ('NULL' : undeclared identifier)

c++ - CLion 灰显包括

c++ - 重写模板类中的虚函数时出错

c++ - 模板是否支持可变数量的参数

c++ - 不参与推导的模板参数包推为空的现行规则草案中的规范规则是什么?

c++ - 分段故障多项式

c++ - 在集合和无序集合之间插入效率?

c++ - MySQL Connect/C++ 64 位构建错误