函数模板的显式实例化失败 (g++)

Ita*_*atz 5 c++ gcc templates g++ eclipse-cdt

我在显式实例化函数模板时遇到了一些问题(即链接错误)。在 Visual Studio 下项目链接正常,只有在 g++/Unix 下,使用 Eclipse-CDT,链接产生错误。

在一个大项目中,函数调用是静态库的一部分,它与动态库链接。该函数的架构如下:

  • 在我的MathUtils.h文件的命名空间内声明(但未实现)的函数模板。函数参数之一本身就是一个结构模板,它在这个文件中声明实现h(在相同的命名空间下)。
  • 函数实现和实例化在MathUtils.cpp.
  • 函数调用在someFile.cpp(当然是哪个#include "MathUtils.h")中,它作为静态库的一部分被编译和链接。

让我(几乎)发疯的事情是构建错误不能完全重现,我怀疑 Eclipse 是罪魁祸首(可能跳过了一些步骤,尽管我clean project在每次构建之前使用)。

大约一个小时,调试配置构建无错误,但发布失败并出现undefined reference to...链接错误。然后,在接下来的一个小时里,两种配置都失败了。然后我做了一个小项目,只有上面提到的 3 个文件,并从命令行和 Eclipse 编译它 - 根本没有错误。现在这两种配置似乎都可以正常链接。

有没有人在使用 Eclipse-CDT 时遇到过类似的问题?有什么建议?

编辑:由于问题不容易(或根本)重现,我想很难得到答案。如果我有任何新的见解,我会更新。

Mel*_*ius 7

我有一个类似的问题。通过移动实例解决了这个问题后,在执行.cpp与类实现。

我的类.hpp:

template <class T>
class MyClass
{
public:
    MyClass();
    // other declarations
};
Run Code Online (Sandbox Code Playgroud)

我的类.cpp:

#include "myclass.hpp"

template <class T>
MyClass<T>::MyClass()
{
}

template class MyClass<int>;
template class MyClass<bool>;
Run Code Online (Sandbox Code Playgroud)


sta*_*ate -1

引自www.cplusplus.com

因为模板是在需要时编译的,所以这对多文件项目施加了限制
:模板类或函数的实现(定义)必须与其声明位于同一文件中。这意味着我们不能将接口分离到单独的头文件中,并且我们必须在使用模板的任何文件中同时包含接口和实现。

  • 这不是真的,寻找“显式实例化”。 (3认同)