二进制表达式的无效操作数'std::__1::ostream'又名'basic_ostream<char>'和'vector<char>'

问题描述

我正在尝试使用哨兵控制循环将 ASCII 数字转换为相应的字母表字母。

编译器给了我 cout 旁边的错误

Invalid operands to binary expression 
('std::__1::ostream' (aka 'basic_ostream<char>') and 'vector<char>')

我正在使用 XCode。这是我当前的代码

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main(){
    int num;
    char intermediary;
    vector<char> Letters;
    cin>>num;
    while (num!= -1){
        intermediary=char(num);
        Letters.push_back(intermediary);
        cin>>num;
    }
    cout<<Letters<<endl;
    return 0;
}

解决方法

std::vectoroperator<< does not have overload,所以当你有 cout << Letters 时,我们可以说,vector 没有定义什么做,当 << 应用于它时。

一段时间后,您会知道当对类应用运算符时,类可以定义适当的行为。这些定义就像普通函数一样,只是有特殊的名称不同。因此,像 << 这样的类型(非内置)的运算符本质上只是函数,具有返回类型、主体和参数列表。

如果您想在 vector打印所有元素,您应该考虑以下方法:

// ...other code as before
for (const auto &c : Letters) // A range for,goes over the whole vector
    std::cout << c;
// ...

此外,您应该将条件更改为:while (cin>>num)。所以整个程序应该是这样的:

int main(){
    int num;
    char intermediary;
    vector<char> Letters;
    while (cin>>num) { // Until valid input,to stop press Ctrl+D (End Of File)
        intermediary=char(num);
        Letters.push_back(intermediary);
    }
    for (const auto &i : Letters)
        cout << i;
    return 0;
}

另请注意,可打印的 ASCII 字符从数字 32 开始。

您可以在here(以及许多其他地方的许多地方)中了解更多关于范围的信息。