使用 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 等。