std :: basic_string的正确用法是什么?我试图用 unsigned char 类型重新声明字符串类型。
#include <iostream>
using namespace std;
int main()
{
typedef basic_string<unsigned char> ustring;
unsigned char unsgndstring[] = {0xFF,0xF1};
ustring lol = unsgndstring;
cout << lol << endl;
return 0;
}
当我尝试上面的代码时,我得到:
main.cpp:25:10: error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream}' and 'ustring {aka std::basic_string}')
cout << lol << endl;
^
为什么我会这样做?声明可以保存未签名字符的新字符串类型的正确方法是什么?
答案 0 :(得分:3)
您的ustring
不是问题 - 只是没有人告诉编译器如何打印ustring
。没有通用的方法,主要是因为不同的字符类型可能需要不同的处理(关于语言环境和编码)。
要解决此问题,您需要定义自己的operator<<
typedef basic_string<unsigned char> ustring;
ostream& operator<<(ostream& stream, const ustring& str)
{
// Print your ustring into the ostream in whatever way you prefer
return stream;
}
但是,我想知道你在这里使用basic_string
的用例是什么。根据我的经验,std::vector<uint8_t>
可以更好地为不直接转换为文本数据的字节序列提供服务,而std::wstring
范围内的字符串大于ASCII(如果由于某种原因不能使用UTF-8) {1}}。前者显然没有任何直接的输出方法(你需要再提出一些自定义的东西,但在这种情况下它更明显是什么意思),而后者支持直接输出到std::wcout
等。