重载 '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;
}
重要提示
请注意,您不应像示例中那样在头文件中使用 using namespace std;
。可以参考Why is "using namespace std;" considered bad practice?.
此外,请注意,由于 operator<<
是一个 non-member 函数,因此我们必须使用 h.mySize
和 h.myVecrtor.at(i)
而不是仅使用 mySize
和myVecrtor.at(i)
.
我正在尝试用 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;
}
重要提示
请注意,您不应像示例中那样在头文件中使用 using namespace std;
。可以参考Why is "using namespace std;" considered bad practice?.
此外,请注意,由于 operator<<
是一个 non-member 函数,因此我们必须使用 h.mySize
和 h.myVecrtor.at(i)
而不是仅使用 mySize
和myVecrtor.at(i)
.