我使用一个库(Orocos),该库使用自定义分配器定义了自己的std::basic_string
。另外,它显式实例化它:
命名空间RTT
{
typedef std::basic_string
}
命名空间标准
{
外部模板类basic_string
}
在我切换到C++ 17之前,这一直很好。在C++ 17中,std::basic_string
具有新功能,即data()
的非const版本。现在,当我进行编译时,我获得了对RTT::rt_string::data()
的 undefined reference ,因为Orocos不知道C++ 17。
最“正确”的事情是什么?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/