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

时间:2010-12-06 17:03:35

标签: c++ templates gcc g++ eclipse-cdt

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

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

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

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

大约一个小时,Debug配置构建没有错误但发布失败,并出现undefined reference to...链接错误。 然后,对于下一个小时,两个配置都失败了。然后我做了一个小项目,只有上面提到的3个文件,并从命令行和Eclipse编译它 - 没有任何错误。现在两种配置似乎都链接好了。

是否有人使用Eclipse-CDT遇到类似问题?有什么建议吗?

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

2 个答案:

答案 0 :(得分:4)

我有类似的问题。通过在具有类实现的.cpp中实现之后的实例化来解决它。

myclass.hpp:

template <class T>
class MyClass
{
public:
    MyClass();
    // other declarations
};

myclass.cpp:

#include "myclass.hpp"

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

template class MyClass<int>;
template class MyClass<bool>;

答案 1 :(得分:-2)

引自www.cplusplus.com

因为模板是在需要时编译的,所以这会强制限制多文件
项目:模板类或函数的实现(定义)必须相同 文件作为其声明。这意味着我们无法在单独的标头中分离接口 文件,我们必须在使用模板的任何文件中包含接口和实现。