-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)' 必须只取一个参数 std::ostream& operator<< (std::ostream& out, point p) { out << "(" << px << ", "<< py<< ", "<< pz << ")"; 返回;}

实际上,代码在“科学计算中的问题和解决方案”的第 402 页类似(除了我使用 3D 而不是 2D)。

为了您的好奇心,这里是强大的结构«点»:

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<<肯定有两个参数;左边<<一个,右边一个。如果你在类中声明操作符,那么左边的参数会自动被认为是有问题的对象(this),所以你只能告诉它右边的参数应该有什么类型。如果将其声明为自由函数,则可以同时选择左右参数类型。

于 2013-10-31T03:25:19.950 回答
0

首先,您应该通过point pconst 引用传递:const point& p因此它不会被重建为新对象。

其次,您似乎在其中定义了一个operator<<函数,class KillThemAll这对于流输出/输入来说是不合法的重载;您必须将其定义为免费的,如果它需要访问私人成员,则必须将其定义为好友功能。

于 2013-10-31T03:16:47.707 回答