c ++朋友重载运算符<< [英] c++ friend overloading operator <<
本文介绍了c ++朋友重载运算符<<的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试重载运算符<<但我一直有这个错误.我尝试进行研究,但没有结果.我有一个带有朋友函数的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
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;
};
Point.cpp
Point.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:
- include防护(
ifndef
,define
和endif
)应位于的开头和结尾标头文件(endif
不得位于源文件中,而应位于标头文件中) - 在标题中使用名称空间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 ++朋友重载运算符<<的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文