无效的操作数二进制表达式:ostream和std::u32string
invalid operands binary expression: ostream and std::u32string
我试图打印出一个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::u32string
是std::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++测试了这个代码片段。
相关文章:
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 使用 AppleClang 时来自 decltype( std::d evlcal<std::ostream>() << std::d eclval<T>() 的奇
- 与'operator<<'不匹配(操作数类型'std::ostream {aka std::basic_ostream<char>}'
- 与"operator<<"不匹配(操作数类型'std::ostream'
- 从 std::ostream 重载 << 运算符时,为什么编译器会给出"too many parameters for this operator function"错误?
- 运算符的歧义错误<<自定义 std::ostream 子类中的重载
- 关于 std::ostream 构造函数
- \main.cpp|103|error: 与"operator<<"不匹配(操作数类型为"std::ostream {aka std::basic_ostream<char&g
- 如何将字节从 std::ostream 流式传输到 std::vector<uint8_t>?
- 在库的公共 API 中从 std::string、std::ostream 等转换
- STD :: Ostream忽略了通过setf()在基础上设置的十六进制标志
- 转发到 std::ostream <<时操纵器的模板参数推断失败
- 将 std::ostream 转换为 std::string
- 为什么重载运算符上的异常说明符'<<'不适用于任何 std::ostream 对象,但对库中定义的运算符不起作用?
- 在Ostream上使用std :: endl使我的文件二进制