在头文件中定义方法时出现c ++链接器错误

时间:2011-10-01 14:22:54

标签: c++ visual-studio

  

可能重复:
  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

是否需要在头文件中定义模板类中的所有方法?它让我的代码看起来很讨厌,但如果这是我对它的唯一方法。

3 个答案:

答案 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)。现在很安全。