使用basic_string声明一种新类型的字符串

时间:2018-05-16 16:51:57

标签: c++ templates typedef stdstring

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;
          ^

为什么我会这样做?声明可以保存未签名字符的新字符串类型的正确方法是什么?

1 个答案:

答案 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等。