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

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

提问人:Santeau 提问时间:6/3/2021 最后编辑:Santeau 更新时间:6/3/2021 访问量:2289

问:

我有一个带有整数动态数组的“IntList”类,但是以下测试代码片段给我带来了麻烦:

主 .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;
}

据我了解,我试图用这个来重载<<运算符:二进制表达式('ostream'(又名'basic_ostream<char>')和'ostream')无效的操作数,但我不知道我在哪里弄错了,因为XCode给了我这个错误:

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

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

C++ IOstream ostream

评论

1赞 Mooing Duck 6/3/2021
是否在标头中声明?ostream& operator<<(ostream& sout, const IntList& list)
3赞 Drew Dormann 6/3/2021
编辑您的问题,以包含显示此错误的最小可重现示例。问题可能存在于您的问题中没有的某些代码细节中。
0赞 Vlad from Moscow 6/3/2021
@Santeau我无法复制:)
1赞 AndersK 6/3/2021
从您显示的代码中,不清楚 operator<< 的函数原型是否在 IntList 标头中。
1赞 molbdnilo 6/3/2021
我只想说.(和 要声明,成员变量是私有的。operator<<{ list.print(sout); return sout; }printgetCapacityconst

答:

4赞 Adrian Mole 6/3/2021 #1

从您显示的片段来看,头文件 () 中没有覆盖的声明。因此,函数中的代码不知道(也不能)知道该重写,该重写在单独的源文件中提供。<<IntList.hppmain

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

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

此外,您的构造函数存在一些严重的错误。在其中,您将值分配给三个局部变量(当构造函数完成时,其数据将完全丢失)。这些变量隐藏了具有相同名称的成员变量。请改用它(即删除声明说明符):IntListint

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

评论

1赞 Remy Lebeau 6/3/2021
"此外,你的 IntList 构造函数有一些严重的错误“——整个类都是有缺陷的,因为它违反了 3 法则。它缺少一个释放数组的析构函数,以及一个复制构造函数和复制赋值运算符来制作数组的副本。