c ++朋友重载运算符<< [英] c++ friend overloading operator <<

查看:73
本文介绍了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 and endif) should be at the very beginning and at the very end of the header file (the endif MUST NOT be in the source file, but in the header file)
  • Adding using namespace std; in headers is bad practice. Use std:: prefix at least in the header. It's your choice if you'll use using namespace std; in the source. I wouldn't, but it's my personal choice.

这篇关于c ++朋友重载运算符&lt;&lt;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆