使用cout与basic_string <unsigned char =“”>

时间:2017-03-29 14:05:44

标签: c++ cout

cout适用于字符串(a.k.a。basic_string<char>)和所有数字类型(intcharunsigned chardouble等)。但是它无法处理basic_string<unsigned char>

#include <iostream>
#include <string>
int main()
{
    std::basic_string<unsigned char> zzz(3, 'z');
    std::cout << zzz << std::endl;
    return 0;
}

这不用

编译
error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'std::basic_string<unsigned char>')

我希望这与字符串的行为方式相同。 ostream没有处理std::basic_string<unsigned char>的原因吗?

4 个答案:

答案 0 :(得分:2)

标准定义了以下模板运算符:

git push --set-upstream origin nameOfBranchYouWantToPush

这意味着您可以将template <class CharT, class Traits, class Allocator> std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const std::basic_string<CharT, Traits, Allocator>& str); 流式传输到std::string,将std::cout传输到std::wstring。您无法将std::wcout传输到std::wstring

您的问题是std::cout使用字符类型std::cout,而不是char

如果您愿意,可以在全局命名空间中定义其他运算符。

unsigned char

答案 1 :(得分:2)

标准库中没有匹配的std::ostream重载。但是,您可以提供自己的超载。 虽然对于不是std::isprint

的字符,您可能会有不同的行为
#include <iostream>
#include <string>

std::ostream& operator << (std::ostream& os, const std::basic_string<unsigned char>& str){
    for(auto ch : str)
        os << static_cast<char>(ch);
    return os;
}

int main()
{
    std::basic_string<unsigned char> zzz(3, 'z');
    std::cout << zzz << std::endl;
    return 0;
}

打印:

zzz

Demo

答案 2 :(得分:1)

std::vector<char>一样,这里没有明显的“默认”行为,所以它不是开箱即用的。 可以工作;你只需要自己定义 的方式。

答案 3 :(得分:0)

全局对象std::cout的类型为std::ostream,它是std::basic_ostream<char>的别名。相关运算符为std::basic_string::operator<<,要求std::basic_string<CharT>std::basic_ostream<CharT>共享相同类型CharT。在您的示例中,您使用的是不支持的std::basic_string<unsigned char>std::basic_ostream<char>,因为unsigned charchar是不同的类型。请注意,signed charunsigned char始终与char不同。

  

char - 用于字符表示的类型,可以在目标系统上最有效地处理(与signed char或unsigned char具有相同的表示和对齐,但始终是不同的类型)。 [...] Link