2012-01-23 178 views
3

Possible Duplicate:
Operator overloading運營商<<重載

我沒有找到,可以幫助我在這個問題的任何東西...... 我嘗試過負荷<< operator,這是我的代碼:

ostream& Complex::operator<<(ostream& out,const Complex& b){ 
    out<<"("<<b.x<<","<<b.y<<")"; 
    return out; 
}  

這是在.h文件中聲明:

ostream& operator<<(ostream& out,const Complex& b); 

我得到這個錯誤: error: std::ostream& Complex::operator<<(std::ostream&, const Complex&) must take exactly one argument

什麼,爲什麼我做錯了? 感謝

回答

9

operator <<應該是免費功能,不Complex類成員,你的情況。

如果你做了operator <<類的成員,它實際上應該帶一個參數,它應該是stream。但是,那麼你就不能寫這樣

std::cout << complex_number; 

complex_number << std::cout; 

這相當於

complex_number. operator << (std::cout); 

這是不常見的做法,你可以注意到,這是爲什麼operator <<通常定義爲自由功能。

+2

,而且這個免費函數通常會成爲你的對象的「朋友」。 – AJG85

0

宣佈作爲朋友是這樣的:

friend ostream& Complex::operator<<(ostream& out,const Complex& b) 
{ ... } 

編輯 >>

我相信上面是不正確的,因爲在宣佈的.cpp的朋友是一個錯誤的語法,它必須是在類定義中聲明爲.h文件中的朋友,並且使其成爲全局函數。

class Complex 
{ 
public: 
    std::ostream& output(std::ostream& s) const; 

    friend std::ostream& operator<< (std::ostream& s, const Complex& c) 
    { 
    return c.output(s); 
    } 
}; 

更多的朋友here

+3

它不能同時是朋友,並在同一時間一員。 –

+0

你是對的,這個話題可能會令人困惑,我的記憶不是新鮮的。在.h文件中聲明一個運算符爲朋友實際上使它成爲一個全局函數,它應該是正確的語法,所以可能不是.cpp文件中的朋友。我認爲它是一種禁止(如果我的記憶是正確的)。 – zar

0

如前所述,流式重載需要成爲您課堂以外定義的免費函數。

就個人而言,我更喜歡遠離friend船程,重定向到一個公共成員函數:

class Complex 
{ 
public: 
    std::ostream& output(std::ostream& s) const; 
}; 

std::ostream& operator<< (std::ostream& s, const Complex& c) 
{ 
    return c.output(s); 
}