【发布时间】:2018-12-31 20:38:37
【问题描述】:
我正在尝试将std::basic_stringstream<char16_t> 与基于UTF16 的std::numpunct 结合使用。但是,即使尝试创建std::numpunct<char16_t> 的最简单可能的派生,也会在链接阶段失败。代码如下:
#include <locale>
struct my_punct : public std::numpunct<char16_t> {};
int main()
{
my_punct n;
}
这里是链接错误(使用 g++ 7.2.0)(live test):
$ g++-7 test0.cpp -o test
/tmp/cc0oWPhL.o: In function `std::numpunct<char16_t>::numpunct(unsigned int)':
test0.cpp:(.text._ZNSt8numpunctIDsEC2Ej[_ZNSt8numpunctIDsEC5Ej]+0x36): undefined reference to `std::numpunct<char16_t>::_M_initialize_numpunct(__locale_struct*)'
/tmp/cc0oWPhL.o: In function `my_punct::~my_punct()':
test0.cpp:(.text._ZN8my_punctD2Ev[_ZN8my_punctD5Ev]+0x18): undefined reference to `std::numpunct<char16_t>::~numpunct()'
/tmp/cc0oWPhL.o:(.rodata._ZTVSt8numpunctIDsE[_ZTVSt8numpunctIDsE]+0x8): undefined reference to `std::numpunct<char16_t>::~numpunct()'
/tmp/cc0oWPhL.o:(.rodata._ZTVSt8numpunctIDsE[_ZTVSt8numpunctIDsE]+0xc): undefined reference to `std::numpunct<char16_t>::~numpunct()'
collect2: error: ld returned 1 exit status
如果我将char16_t 更改为char,则链接成功完成。那么,我在这里做错了什么?我需要一些额外的库来链接吗?
作为健全性检查,我已尝试为_ZTVSt8numpunctIDsE grepping GCC 安装,但没有给出任何结果。但是寻找_ZTVSt8numpunctIcE 确实找到了libstdc++.so.6.0.24。这是否意味着我在 libstdc++ 中发现了一个错误?
【问题讨论】:
-
看起来C++库只需要实现模板for
charandwchar_t。对于char16_t,你运气不好,你的 C++ 库不支持它。 -
@SamVarshavchik 这将是一个更好的答案。