c++ - 针对过时的模板显式实例进行编译

标签 c++ linker c++17

我使用一个库(Orocos),该库使用自定义分配器定义了自己的std::basic_string。另外,它显式实例化它:
命名空间RTT
{
typedef std::basic_string ,RTT::os::rt_allocator > rt_string;
}

命名空间标准
{
外部模板类basic_string ,RTT::os::rt_allocator >;
}

在我切换到C++ 17之前,这一直很好。在C++ 17中,std::basic_string具有新功能,即data()的非const版本。现在,当我进行编译时,我获得了对RTT::rt_string::data()的 undefined reference ,因为Orocos不知道C++ 17。
最“正确”的事情是什么?

  • 修补库以至少编译C++ 17中的模板实例。
  • 修补库以不显式实例化此类。
  • 不要使用这些方法。我可以解决这个问题,但是每次在非const对象上使用该方法时,我都必须做类似const_cast<RTT::rt_string const&>(myString).data()的操作。另外,如果我忘记了,我将再次遇到奇怪的链接器错误。
  • 以某种方式将这些符号添加到我的库中。
  • data()是一个隐式内联函数,如果我在发行版中进行编译,该问题将不复存在。并不是真正的解决方案。
  • 最佳答案

    您应该能够将缺少的成员函数的显式实例化定义添加到您自己的代码中(恰好在一个源文件中):

    template char* std::basic_string<char, std::char_traits<char>, RTT::os::rt_allocator<char> >::data() noexcept;
    
    这并不是严格遵守的,因为不能保证标准库中的成员函数签名,但是一起使用两种语言版本已经超出了该标准的正式范围(使用任何程序的两种不同版本可能违反ODR,以这种方式定义类(模板)。

    关于c++ - 针对过时的模板显式实例进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62539889/

    相关文章:

    c++ - 为什么第32769个插入在std::unordered_set中失败?

    c++ - class type info MACRO 可以用模板代替吗?

    c++ - 我可以避免为 std::variant 中的每个结构显式编写构造函数吗?

    c++ - const关键字在C++函数原型(prototype)中意味着什么?

    c++ - 条件运算符在 VS2010 中的正确行为?

    c++ - 如果范围未排序,inplace_merge 会做什么?

    linux - 构建一个使用 ld 的选项 -rpath 和 $ORIGIN 的简单(hello-world-esque)示例

    c++ - 使用 gl3w 的 OpenGL

    c++ - QWidget 应用程序 w/QML 和注册类型

    c - 是否可以分多个步骤链接/正在链接 "associative"?