cout适用于字符串(a.k.a。basic_string<char>
)和所有数字类型(int
,char
,unsigned char
,double
等)。但是它无法处理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>
的原因吗?
答案 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
答案 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 char
和char
是不同的类型。请注意,signed char
和unsigned char
始终与char
不同。
char - 用于字符表示的类型,可以在目标系统上最有效地处理(与signed char或unsigned char具有相同的表示和对齐,但始终是不同的类型)。 [...] Link。