可能重复:
Where to define C++ class member template function and functors that instantiate it?
inclusion of header files in case of templates
我正在使用类模板。我的课程中有几个方法,如果我在.cpp文件中定义它,我会收到链接器错误
error LNK2019: unresolved external symbol
是否需要在头文件中定义模板类中的所有方法?它让我的代码看起来很讨厌,但如果这是我对它的唯一方法。
答案 0 :(得分:4)
是否需要在头文件中定义模板类中的所有方法?
是。但您仍然可以将不依赖于模板参数的部分分解出来,并将它们作为普通函数或mixin类放在常规模块中:
class NonTemplatedOpsMixin
{
int bar(); // defined elsewhere
};
template <typename T>
class TemplatedStuff : private NonTemplatedOpsMixin
{
T foo(T &x) { x += bar(); }
};
答案 1 :(得分:1)
是否需要在头文件中定义模板类中的所有方法?
是:对于编译器实例化模板方法定义,它必须具有该方法的主体。
这让我的代码看起来很讨厌
一种常见的技巧是在标题中包含单独的部分:
template <typename T> class Foo {
int Method();
};
// Other classes ...
// Now supply implementation details, not relevant to users of the class
template <typename T> int Foo<T>::Method()
{
// implementation
}
// Other implementations
另一种技术是将物体移动到单独的头文件中,例如,来自foo-inl.h
#include "foo-inl.h"
和foo.h
答案 2 :(得分:1)
是否需要在头文件中定义模板类中的所有方法?
是
这让我的代码看起来很讨厌,但如果这是我唯一的方式。
在这种情况下,您可以在标题中包含.cpp
文件:
//filename.h
template<typename T>
class whatever
{
//...
};
#include "filename.cpp" //write this at the bottom of filename.h
它相当于在标题本身中提供所有模板定义,但实际上你有两个文件。
好的,正如评论所说,构建系统可能对扩展程序.cpp
不满意,在这种情况下,您可以选择.h
代替(.hpp
)。现在很安全。