无效的操作数二进制表达式:ostream和std::u32string

invalid operands binary expression: ostream and std::u32string

本文关键字:ostream std u32string 表达式 操作数 二进制 无效      更新时间:2023-10-16

我试图打印出一个std::u32string,但我一直得到一个编译错误说:

error: invalid operands to binary expression
  ('ostream' (aka 'basic_ostream<char>') and 'std::u32string' (aka
  'basic_string<char32_t>'))

我的代码是这样组成的:

std::u32string test = U"hello";
std::cout << test << std::endl;

有人知道打印u32string的正确方法是什么吗?我对使用普通字符串或wchar字符串不感兴趣。

c++标准库流类型是将字符类型作为第一个模板参数的模板。例如,std::ostream实际上是std::basic_ostream<char>,正如您从错误消息中看到的那样。一般来说,您可以将std::basic_string<T>发送到std::basic_ostream<T>。但是std::u32stringstd::basic_string<char32_t>,所以类型不匹配。

不幸的是,没有std::u32cout类型的std::basic_ostream<char32_t>或类似的东西,所以你唯一的选择是将UTF-32编码的字符串转换为另一种编码。

下面的代码使用std::wstring_convert将UTF-32编码的字符串转换为UTF-8。UTF-8字符串可以直接打印为std::cout

std::u32string test = U"hello";
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> cv;
std::cout << cv.to_bytes(test) << std::endl;

注意,codecvt还没有在libstdc++中实现。我使用clang/libc++测试了这个代码片段。

相关文章: