【问题标题】:explicit instantiation of function template fails (g++)函数模板的显式实例化失败 (g++)
【发布时间】:2010-12-06 17:03:34
【问题描述】:

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

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

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

让我(几乎)发疯的事情是构建错误不能完全重现,我怀疑应该归咎于 Eclipse(也许跳过了一些步骤,尽管我在每次构建之前都使用clean project)。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我遇到了类似的问题。通过将.cpp 中的实例化after 实现与类实现一起移动来解决它。

    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>;
    

    【讨论】:

      【解决方案2】:

      引用www.cplusplus.com

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

      【讨论】:

      • 那不是真的,找explicit instantiation
      • 我的错误 - 我误读了类模板的函数模板。
      • 不要引用 cplusplus.com。说真的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2015-02-09
      • 1970-01-01
      • 2011-06-23
      • 2014-02-26
      • 2011-10-07
      相关资源
      最近更新 更多