C++ - 二进制表达式的无效操作数 'basic_ostream<char>'

C++ - Invalid operands to binary expression 'basic_ostream<char>'

我有一个 'IntList' class 和一个动态整数数组,但是下面的测试代码片段给我带来了麻烦:

main.cpp

#include <iostream>
#include "IntList.hpp"
using std::cout;
using std::endl;

int main(int argc, const char * argv[]) {
    IntList list{};
    cout << "list-1 -> " << list << endl;
    return 0;
}

IntList.hpp:

#ifndef IntList_hpp
#define IntList_hpp

#include <stdio.h>
using std::ostream;
class IntList
{
public:
    int *dynarray;
    int capacity;
    int used;
    IntList();
    void pushBack(int x);
    int getCapacity();
    void print(ostream& sout);
};
#endif

IntList.cpp

#include <iostream>
#include "IntList.hpp"
using std::cout;
using std::endl;
using std::string;
using std::ostream;

IntList::IntList()
{
    int capacity = 1;
    int used = 0;
    int *dynarray = new int[capacity];
}

ostream& operator<<(ostream& sout, const IntList& list)
{
    for (int i = 0; i < list.used; ++i)
        sout << list.dynarray[i] << " ";
    return sout;
}

据我所知,我试图用这个重载 << 运算符: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'ostream') 但我不知道我在哪里弄错了,因为 XCode 给我这个错误:

Invalid operands to binary expression ('basic_ostream<char>' and 'IntList')

知道如何解决这个问题吗?

似乎(从您显示的片段来看)header 文件 (IntList.hpp) 中没有声明您的 << 覆盖。因此,您的 main 函数中的代码不会(也不能)知道该覆盖,它在单独的源文件中提供。

您需要在 header 中添加该覆盖函数的 声明(通常,就在 class 定义之后),如下所示:

// Declaration (prototype) of the function for which the DEFINITION is provided elsewhere
extern ostream& operator<<(ostream& sout, const IntList& list);

此外,您的 IntList 构造函数存在一些严重的错误。在其中,您正在为三个 local 变量赋值(构造函数完成时,其数据将完全丢失)。这些变量隐藏了同名的成员变量。改用它(即删除 int 声明说明符):

IntList::IntList()
{
//  int capacity = 1; // This declares a local variable that hides the member!
    capacity = 1;
    used = 0;
    dynarray = new int[capacity];
}