在我正在进行的项目中,我有一个Score类,在score.h中定义如下.我试图超载它,当一个<<对它执行操作,_points“”_name被打印. 这是我试图做的事情:
ostream & Score::operator<< (ostream & os, Score right)
{
os << right.getPoints() << " " << right.scoreGetName();
return os;
}
以下是返回的错误:
score.h(30) : error C2804: binary 'operator <<' has too many parameters
(此错误实际出现4次)
我设法通过将重载声明为友元函数来使其工作:
friend ostream & operator<< (ostream & os, Score right);
并从score.cpp中的函数声明中删除Score ::(实际上不会将其声明为成员).
为什么这样做,但前一段代码没有?
谢谢你的时间!
编辑
我删除了头文件上的重载的所有提及…但我得到以下(和唯一)错误.二进制’<<' :找不到哪个运算符采用“得分”类型的右手操作数(或者没有可接受的转换)
为什么我的测试在main()中找不到合适的重载? (这不是包括,我查了一下)
以下是完整的分数
#ifndef SCORE_H_
#define SCORE_H_
#include <string>
#include <iostream>
#include <iostream>
using std::string;
using std::ostream;
class Score
{
public:
Score(string name);
Score();
virtual ~Score();
void addPoints(int n);
string scoreGetName() const;
int getPoints() const;
void scoreSetName(string name);
bool operator>(const Score right) const;
private:
string _name;
int _points;
};
#endif
解决方法:
注意:您可能需要查看operator overloading FAQ.
二元运算符可以是其左侧参数类或*函数的成员. (某些运算符,如赋值,必须是成员.)由于流运算符的左侧参数是流,因此流运算符必须是流类或*函数的成员.实现运算符的规范方法<<对于任何类型是这样的:
std::ostream& operator<<(std::ostream& os, const T& obj)
{
// stream obj's data into os
return os;
}
请注意,它不是成员函数.另请注意,它使对象按每个const引用进行流式处理.那是因为您不想复制对象以便对其进行流式处理,并且您不希望流式传输也改变它.
有时您希望通过类的公共接口流式传输内部无法访问的对象,因此运算符无法获取它们.然后你有两个选择:将公共成员放入进行流式处理的类中
class T {
public:
void stream_to(std::ostream&) const {os << obj.data_;}
private:
int data_;
};
并从操作符那里打电话:
inline std::ostream& operator<<(std::ostream& os, const T& obj)
{
obj.stream_to(os);
return os;
}
或者让运算符成为朋友
class T {
public:
friend std::ostream& operator<<(std::ostream&, const T&);
private:
int data_;
};
这样它就可以访问班级的私人部分:
inline std::ostream& operator<<(std::ostream& os, const T& obj)
{
os << obj.data_;
return os;
}