-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 の宣言を禁止します

名前空間 std を使用して iostream 、 fstream を既に含めていますが、何が問題なのかわかりません

4

2 に答える 2

0

(Dietmar Kühlが述べたように)飛び出すのは、istreamの参照を返していないということです。このメソッドヘッダーを変更してみてください

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

これに:

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

経験則として、コピー コンストラクターを作成していないオブジェクトへの参照を返すことは、通常は良い考えです。参照を返すということは、オブジェクトが配置されているアドレスを返すことを意味します。値によって正しく返すには、返されるオブジェクトのコピーが作成されている必要があります。

于 2013-11-10T15:06:05.520 に答える