-1

我有一Point2D堂课,我正在尝试重载输入运算符>>

class Point2D
{
 public:
           Point2D(int,int);
           int getX();
           int getY();

           void setX(int);
           void setY(int);

           double getScalarValue();

          bool operator < ( const Point2D& x2) const
          {
            return x < x2.x;
          }

              friend istream& operator >> (istream&,Point2D);


 protected:

             int x;
             int y;
             double distFrOrigin;
             void setDistFrOrigin();


};

在我的主要功能之外

    #include <iostream>
    #include <fstream>
    #include "Line2D.h"
    #include "MyTemplates.h"
    #include <string>
    #include <set>

    using namespace std;

    istream operator >> (istream& is , Point2D p2d)
    {
        string p;
        getline(is,p,'\n');
       int position = p.find(", ");

        string k = p.substr(0,position);

       if ( k == "Point2D")
       {
         string x = p.substr(10,1);
         int x_coordinate = atoi(x.c_str()); // atoi(x.c_str()) convert string x to int
         p2d.setX(x_coordinate);

       }

       return is;
    }

在我的 int main()

    int main()
{

   fstream afile;
   string p;
   afile.open("Messy.txt",ios::in);

   if (!afile)
   {
     cout<<"File could not be opened for reading";
     exit(-1);
   }

   Point2D abc;

   afile>>abc;

   set<Point2D> P2D;
   P2D.insert(abc);

   set<Point2D>::iterator p2 = P2D.begin();

   while ( p2 != P2D.end() )
   { 
     cout<<p2->getX();
     p2++;
   }

}

我不明白为什么会出现错误:

c++禁止声明没有类型的istream

我已经包含了 iostream , fstream ,使用命名空间 std ,我不知道出了什么问题

4

2 回答 2

2

您的代码中有几个问题。

  1. 这是您的错误消息的原因。你#include <iostream>不在Point2D.h/ Line2D.h

    正如其他人已经建议的那样,使用std::istream而不仅仅是istream.

  2. 正确的operator>>()应该是

    std::istream &operator>>(std::istream &is, Point2D &p2d);
    

    注意std::istream& Point2D&。_ Point2D&很重要,因为否则您修改本地副本并且给定参数保持不变。

  3. 您的输入运算符很脆弱。它容易受到或多或少的空格的影响。您允许. x_coordinate此外,您在 . 之外跳过一个字符Point2D,。更好的方法可能是仅用空格分隔部分,并让 iostream 库处理解析。例如

    Point2D 15 28
    

    可以阅读

    string tag;
    is >> tag;
    if (tag == "Point2D")
        is >> p2d.x >> p2d.y;
    
    return is,
    
于 2013-11-10T15:12:54.543 回答
0

突然出现的事情(正如 Dietmar Kühl 提到的)是您没有返回 istream 的引用。尝试更改此方法标头

istream operator >> (istream& is , Point2D p2d)

对此:

istream& operator >> (istream& is , Point2D p2d)

根据经验,返回对您没有为其创建复制构造函数的对象的引用通常是一个好主意。返回引用意味着您正在返回对象所在的地址。为了正确地按值返回,需要有一个被返回对象的副本。

于 2013-11-10T15:06:05.520 回答