<分区>
所以我在我的 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++ 还是比较陌生,所以我试图理解为什么在第一个示例中我需要在同一个文件中声明和定义,而在第二个示例中,它们可以分开。