2013-10-31 65 views
-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)’ must take exactly one argument std::ostream& operator<< (std::ostream& out, point p) { out << "(" << p.x << ", "<< p.y<< ", "<< p.z << ")"; return out;}

actualy,代碼爲«問題&解決方案在科學的一個p.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);} 
    }; 
+1

請參閱http://stackoverflow.com/questions/10744787/operator-必須採用完全一致的參數 – godel9

+0

@ godel9謝謝 –

回答

1

從錯誤消息看來,您宣稱您的operator<<作爲point類中的成員函數。這不是你想要的。

取而代之的是,將其聲明爲自由函數(在您的point類之外)。如果需要訪問point的私人會員,請將其添加爲朋友。

爲什麼?

當你考慮它時,顯然任何operator<<都必須有兩個參數;一個在<<的左側,另一個在右側。如果你在課堂上聲明瞭操作符,那麼左邊的參數會自動被認爲是所討論的對象(this),所以你只能告訴它正確的參數應該有什麼類型。如果你將它聲明爲一個自由函數,那麼你可以選擇左和右參數類型。

+0

好吧,你有足夠的重點,我沒有足夠小心......我在'point'中有'operator''(這是一個'struct')...這是我的一個錯誤,我同意它不應該'不要在那裏!所以謝謝! –

0

首先,你應該通過const引用傳遞point pconst point& p所以它是沒有得到重建爲一個新的對象。

其次,您似乎在class KillThemAll內定義了operator<<函數,這對流輸出/輸入來說不是合法的重載;你必須將它定義爲一個免費的,如果它需要訪問私人成員,朋友功能。

+2

或作爲「朋友」功能。 – 0x499602D2

+0

好吧,正如所說的這段代碼來自一本書,所以對於const,我同意你的看法,但我只是像寫它一樣複製。我今天沒有聽說過重載<<必須是一個免費函數,在它的書中,我使用了一個名稱空間來爲個人方便。謝謝 –

+0

如果'point'很小,並且有一個平凡的拷貝構造函數,那麼通過值傳遞它比通過const引用更高效,但顯然這取決於很多因素。另外,從它看起來'KillThemAll'(!)是一個名字空間;問題在於'operator''正在'point'類中聲明。 –