【问题标题】:invalid operands binary expression: ostream and std::u32string无效的操作数二进制表达式:ostream 和 std::u32string
【发布时间】:2014-07-03 17:33:17
【问题描述】:

我正在尝试打印出 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 字符串不感兴趣。

【问题讨论】:

  • std::u32stringtypedefbasic_stream &lt;char32_t&gt;,对于 char32_t 类型的字符只有 operator&lt;&lt;coutwcout 不是这种情况)。我会把这个问题作为重复的,因为知道这一点,链接的问题会回答你的问题。
  • @Holt:链接的问题询问为什么这不容易做到,但没有询问如何做到这一点。我说这个问题不是重复的。
  • 我之前确实看过那个帖子,但我不认为它是重复的,因为正如 Brian 所说,它没有解释我如何实际打印 u32strings。

标签: c++ c++11


【解决方案1】:

C++ 标准库流类型是以字符类型作为第一个模板参数的模板。例如,std::ostream 真的是std::basic_ostream&lt;char&gt;,从错误消息中可以看出。通常,您可以将std::basic_string&lt;T&gt; 发送到std::basic_ostream&lt;T&gt;。但是std::u32stringstd::basic_string&lt;char32_t&gt;,所以类型不匹配。

不幸的是,没有 std::basic_ostream&lt;char32_t&gt; 类型的 std::u32cout 或类似的东西,所以您唯一的选择是将 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;

请注意,libstdc++ 中尚未实现 codecvt。我使用 clang/libc++ 测试了这段代码 sn-p。

【讨论】:

  • 我把它放到了我的代码中,但是转换器的声明由于一些奇怪的原因破坏了其他一些东西。我正在调查。
  • OP 的代码没有被破坏。我不确定为什么它会对我的代码产生奇怪的副作用,但这是我的错,而不是他的 sn-ps。我有一堆未初始化的整数计数器,我正在递增它们。在我添加 sn-p 之前,它们都以某种方式自动初始化为 0(这是所需的行为),但不是在我添加声明转换器的行之后,这会破坏事情。
猜你喜欢
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 2016-05-08
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多