gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:01:03 25 4
gpt4 key购买 nike

我使用一个库(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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com