重载 'operator<<' 必须是二元运算符(有 3 个参数)

Overloaded 'operator<<' must be a binary operator (has 3 parameters)

我正在尝试用 C++ 实现堆 ADT。 我目前在重载的运算符 << 中遇到问题。我看到了很多解决方案,但对我没有用:first solution || Here is the second one

这是 hpp 文件:

#ifndef Heap_hpp
#define Heap_hpp

#include <stdio.h>
#include <vector>
#include <string>
#include <iostream>


using namespace std;
typedef int elementType;

class Heap{
private:
    vector<elementType> myVecrtor;
    int mySize = 1; //The minimum size is 1 since 
                   //the first element is a dummy.

public:
    Heap();
    //some functions...
    //My problem is in this function
    friend ostream& operator<<(ostream &out, Heap &h);
    void perculateDown(int root);
    void perculateUp();
};

#endif /* Heap_hpp */

这是 cpp 文件:

#include "Heap.hpp"
using namespace std;

Heap::Heap(){
}
ostream& Heap::operator<<(ostream &out, Heap &h){//it is giving me the error here
    out<<"\t\tHeap:";
    for(int i = 0; i < mySize; i++){
        out<<myVecrtor.at(i);//this is not what i actualy want to display, just a demo
    }
    return out;
}

我需要说明一下,我不是以朋友的身份尝试过它,但它给了我同样的错误 并且像这样在 cpp 文件中初始化函数时:

ostream& operator<<(ostream &out, Heap &h)

错误消失了,但我无法使用任何成员。 除了我提到的解决方案之外的任何帮助,我们将不胜感激。

同时删除限定条件 (Heap::) 会阻止我出于某种原因使用 class 的任何成员。 错误:使用了未声明的标识符 'mySize'

image showing the error 我尝试使用 h.mySize,它给了我: 'mySize' 是 'Heap' 的私有成员 private member error photo

问题是您将重载的operator<<定义为class的成员函数 Heap 而不是将其定义为 non-member 函数。

为了解决这个你应该在定义重载operator<<时删除Heap资格(Heap::),如下所示:

//------v-----------------------------------> removed Heap:: from here
std::ostream& operator<<(std::ostream &out, Heap &h){
    for(int i = 0; i < h.mySize; i++){
//---------------------^^-------------------->added h. here
        out<<h.myVecrtor.at(i); 
//-----------^^------------------------------>added h. here
    } 
    return out;
}

此外,在实现重载 operator<< 时,我们将第二个参数作为 const 的左值引用,因为 operator<< 不会更改对象的状态。所以修改后的代码看起来像这样:

class Heap{
//other code as before
public:
//------------------------------------------vvvvv------------>added const here
    friend std::ostream& operator<<(std::ostream &out,const Heap &h);
   
};
//------v---------------------------------------------> removed Heap:: from here
std::ostream& operator<<(std::ostream &out,const Heap &h){
//-------------------------------^^^^^---------------->added const here
    for(int i = 0; i < h.mySize; i++){
        out<<h.myVecrtor.at(i);//this is not what i actualy want to display, just a demo
    }
    return out;
}

Demo

重要提示

请注意,您不应像示例中那样在头文件中使用 using namespace std;。可以参考Why is "using namespace std;" considered bad practice?.

此外,请注意,由于 operator<< 是一个 non-member 函数,因此我们必须使用 h.mySizeh.myVecrtor.at(i) 而不是仅使用 mySizemyVecrtor.at(i).