-2

コード :

std::ostream& operator << (std::ostream& out, point p) { 
  out << "(" << p.x << ", "<< p.y<< ", "<< p.z << ")";
  return out;
}

エラー:

'std::ostream& KillThemAll::point::operator<<(std::ostream&, KillThemAll::point)' は 1 つの引数を取る必要があります std::ostream& operator<< (std::ostream& out, point p) { out << "(" << px << ", "<< py<< ", "<< pz << ")"; 戻る;}

実際、コードは « Problems & Solutions In Scientific Computing » の 1 ページ 402 に似ています (ただし、2D ではなく 3D を使用しています)。

あなたの好奇心のために、ここに強力な構造 « point » があります:

struct point{
    double x,y,z;
    point() { x=y=z=0.0;}
    point(double _x, double _y, double _z){this->x=_x, this->y=_y, this->z=_z;}
    point operator - (const point& _p) const { return point(x-_p.x, y-_p.y, z-_p.z);}
    point operator + (const point& _p) const { return point(x+_p.x, y+_p.y, z+_p.z);}
    double operator * (const point& _p) const { return x*_p.x+y*_p.y+z*_p.z;}
    point operator * (const double _t) const { return point(_t*x, _t*y, _t*z);}
    point operator / (const double _t) const { if(_t!=0) return point(x/_t, y/_t, z/_t);}
  };
4

2 に答える 2

1

エラー メッセージから、クラスoperator<<のメンバー関数として宣言しているように見えます。pointこれはあなたが望むものではありません。

point代わりに、(クラスの外で) フリー関数として宣言します。のプライベート メンバーにアクセスする必要がある場合はpoint、フレンドにします。

なんで?

これについて考えてみると、anyoperator<<には厳密に 2 つの引数が必要であることは明らかです。の左側に<<1 つ、右側に 1 つ。演算子をクラス内で宣言すると、左の引数が自動的に問題のオブジェクト ( this) になるため、右の引数の型を指定することしかできません。フリー関数として宣言すると、左と右の両方の引数の型を選択できます。

于 2013-10-31T03:25:19.950 に答える
0

point pまず、 const 参照で渡す必要があります。const point& pそのため、新しいオブジェクトとして再構築されません。

operator<<第二に、これ内で関数を定義しているようですがclass KillThemAll、ストリーム出力/入力の正当なオーバーロードではありません。これをフリーとして定義する必要があります。また、プライベート メンバーにアクセスする必要がある場合は、フレンド関数として定義する必要があります。

于 2013-10-31T03:16:47.707 に答える