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

时间:2014-07-03 17:33:17

标签: c++ c++11

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

1 个答案:

答案 0 :(得分:1)

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 ++测试了这段代码。

相关问题