本文介绍了C++友元重载运算符&lt;<的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试重载运算符 <<但我一直有这个错误.我尝试做研究,但没有结果.我有一个 Point2D.h 和一个 Point2D.cpp,有一个友元函数可以重载.以下是我的代码:
I am trying overload the operator << but i keep having this error. I try doing research but with no result. I have a Point2D.h and a Point2D.cpp with a friend functions to overload. Below are my codes:
Point2D.h
#include <string>
#include <iomanip>
using namespace std;
#ifndef Point2D_H
#define Point2D_H
class Point2D
{
friend ostream& operator<< (ostream&, Point2D);
public:
Point2D();
Point2D(int, int);
protected:
int x;
int y;
};
点.cpp
#include <string>
#include <cmath>
#include <iomanip>
#include "Point2D.h"
Point2D::Point2D() {
this->x=0;
this->y=0;
}
Point2D::Point2D(int x, int y) {
this->x=x;
this->y=y;
}
ostream& operator<< (ostream &out, Point2D pt)
{
out << "Point = " <<pt.x;
return out;
}
#endif
以下是我的错误信息,不知道为什么没有匹配该方法
Below are my error message, not sure why there is no match for that method
Point2D.h: In function ‘std::ostream& operator<<(std::ostream&, Point2D)’:
Point2D.h:37:9: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘int’)
out << pt.x;
^
Point2D.h:37:9: note: candidates are:
Point2D.h:35:10: note: std::ostream& operator<<(std::ostream&, Point2D)
ostream& operator<< (ostream &out, Point2D pt)
^
Point2D.h:35:10: note: no known conversion for argument 2 from ‘int’ to ‘Point2D’
In file included from Point2D.h:2:0,
from Point3D.h:2,
from Point3D.cpp:2:
/usr/include/c++/4.8/iomanip:235:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Setw)
operator<<(basic_ostream<_CharT, _Traits>& __os, _Setw __f)
推荐答案
您需要
#include <iostream>
或者至少
#include <ostream>
另外 2 个建议:
2 other advises:
- 包含守卫(
ifndef
、define
和endif
)应该在 的开头和结尾头文件(endif
不能在源文件中,而在头文件中) - 在标题中添加
using namespace std;
是不好的做法.至少在标题中使用std::
前缀.如果您将在源代码中使用using namespace std;
,这是您的选择.我不会,但这是我个人的选择.
- the include guards (
ifndef
,define
andendif
) should be at the very beginning and at the very end of the header file (theendif
MUST NOT be in the source file, but in the header file) - Adding
using namespace std;
in headers is bad practice. Usestd::
prefix at least in the header. It's your choice if you'll useusing namespace std;
in the source. I wouldn't, but it's my personal choice.
这篇关于C++友元重载运算符&lt;<的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!