Использование basic_string для объявления нового типа строки - PullRequest
0 голосов
/ 16 мая 2018

Как правильно использовать 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 голосов
/ 16 мая 2018

Ваш 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 и т. Д.

...