2014-04-21 146 views
-3

我是C++的初學者,我有以下問題。 當我在VS2013中運行以下代碼時,出現錯誤。C++ operator <<重載

class Y{ 
public: 
    Y(int un_x, int un_y) 
    : x_(un_x), y_(un_y) {} 

    int x() const { 
     return x_; 
    } 
    int y() const { 
     return y_; 
    } 
private: 
    int x_; 
    int y_; 
}; 
class X{ 
    private: 
     Y coord; 
    public: 
    // some code ... 

     Y position() const { 
      return coord; 
     } 

     void display(ostream& output) const { 
      output << "The object is in position " << position(); 
     } 
}; 




ostream& operator<<(ostream& output, Y x){ 
    output<< "(" << x.x() << ", " << x.y() << ")" << endl; 
    return output; 
} 

如果我創建類X的對象some_object並儘量做到:

cout << some_object ; 

我得到followng錯誤:

error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const Y' (or there is no acceptable conversion) 
+0

您無法運行該代碼,因爲沒有實際的代碼可以運行(如主功能)。如果你的意思是你在代碼下面提到的內容,那麼輸出'X'不會超載。 – chris

+1

上面鏈接的代碼由MooingDuck編譯並在VS2013下正確運行。請發佈重現問題的[SSCCE](http://sscce.org)。 – Praetorian

+2

另外,'X'與這個問題有什麼關係? –

回答

7

是在<<操作之後定義你嘗試使用它 - 那是在display()函數之後?如果是這樣,你將需要可以移動它,使它在使用之前定義的,或者至少是,聲明它(即,因爲它提供了一個原型):

ostream& operator<<(ostream &output, Y x); 

一點題外話,你應該不斷的參考,而不是按值傳遞的Y實例:

ostream& operator<<(ostream& output, Y const& x); 
+0

嗯,這會教我認爲X是無關緊要:http://coliru.stacked-crooked.com/a/3e58bfe2f577ee43 :( –

+0

沒錯,現在它的工作,非常感謝你 –

+0

+1我真的需要開始張貼這樣的長篇大論評論= P尼斯回答之前閱讀的答案。 – WhozCraig

0

你只超載了operator <<Y類,你沒有超載它X類。所以它找不到一個。除此之外,你應該通過常量引用將Y傳遞給操作符。

這是基於你的陳述,你試過cout << some_object其中some_objectX。如果您嘗試使用some_object.display(),則可能會遇到其他用戶描述的問題。

如果這是一個錯字,那麼答案,而不是移動到聶的帖子,但我要再次強調,你應該通過引用或常量引用

+0

我不是downvoting你因爲這個問題缺乏細節,但據推測,因爲他的重載'運營商<<''爲Y'中,OP是路過的一個實例'Y'而不是'X'爲'運營商<<'。 – Praetorian

+0

@Praetorian但他沒有閱讀問題和前右它的語句,其產生的誤差。 – UpAndAdam

+0

哎呀,看樣子我沒看過這個問題完全要麼。對於先前的評論道歉。但是,考慮到錯誤消息,則*不*外觀像他的傳球在Y'的'一個實例。 – Praetorian

0

您收到此錯誤,因爲ü沒有宣佈的ostream &操作<通<(ostream的&輸出,Y X)爲Y的友元函數 以使此功能爲Y的友元函數嘗試爲X不能夠訪問你的兩個聲明的函數

朋友ostream的&操作< <(ostream的01輸出,Y x);

+0

他爲什麼需要這樣做?他只使用公共職能。你錯了。 – UpAndAdam

+0

你需要這個,因爲Y的運算符<<不可用於X. 並且通過朋友功能他可以實現他想要的。 –

+0

除了你沒有。它沒有被定義爲任何人都可以使用的類成員,它被定義爲一個自由函數。因此,他只使用公開課的方法。 – UpAndAdam