在编译时重载<<,错误

时间:2013-10-31 02:39:33

标签: c++ operator-overloading

代码:

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

错误:

  

“的std :: ostream的&安培; KillThemAll :: point :: operator&lt;&lt;(std :: ostream&amp;,KillThemAll :: point)'   必须采取一个参数        的std :: ostream的和放;运营商LT;&LT; (std :: ostream&amp; out,point p){out&lt;&lt; “(”&lt;&lt;&lt;&lt; p.x&lt;&lt;“,”&lt;&lt; p.y&lt;&lt;“,”&lt;&lt; p.z&lt;&lt;“)”;退出;}

实际上,代码在“问题与解决方案”的第40页中类似。科学计算中的解决方案»(除了我使用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);}
  };

1 个答案:

答案 0 :(得分:1)

从错误消息中,您似乎将operator<<声明为point类中的成员函数。这不是你想要的。

相反,将其声明为自由函数(在point类之外)。如果需要访问point的私人成员,请将其设为好友。

<强>为什么吗

当你考虑它时,很明显任何operator<<必须有两个参数; <<左侧一个,右侧一个。如果在类中声明运算符,则左参数自动被视为有问题的对象(this),因此您只能告诉它正确的参数应具有的类型。如果将其声明为自由函数,则可以选择左右参数类型。