使用 basic_string 声明新的字符串类型
Using basic_string to declare a new type of string
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;
^
为什么我会收到那个?声明可以容纳无符号字符的新字符串类型的正确方法是什么?
您的 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>
提供更好的服务,而范围大于 ASCII 的字符串(如果由于某种原因不能使用 UTF-8)由 std::wstring
.前者显然没有任何直接输出方法(您将再次需要自定义一些东西,但在那种情况下,意图更明显),后者支持直接输出到 std::wcout
等。
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;
^
为什么我会收到那个?声明可以容纳无符号字符的新字符串类型的正确方法是什么?
您的 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>
提供更好的服务,而范围大于 ASCII 的字符串(如果由于某种原因不能使用 UTF-8)由 std::wstring
.前者显然没有任何直接输出方法(您将再次需要自定义一些东西,但在那种情况下,意图更明显),后者支持直接输出到 std::wcout
等。