2012-09-13 73 views
1

我有這樣的成員函數爲什麼我的運算符重載不能編譯?

std::ostream& operator<<(std::ostream &stream) const 
Histogram<T>

然後在另一個類我有

static void write(const RGBHistogram<T> &hist, Output &output) 
{ 
    std::cout << hist.redHist << std::endl; 
} 

redHist,greenHist和blueHist是直方圖。

爲什麼它會抱怨沒有操作員找到需要類型直方圖的右側操作數的操作符?

+1

它必須是非成員函數。 'cout << hist'變成'operator <<(cout,hist)',它與你的成員函數不匹配。 – BoBTFish

回答

5

你應該通過引用你的類,它應該是朋友不是成員函數。

friend std::ostream& operator<<(std::ostream &ostream, const RGBHistogram<T> &stream) 
{ 

    // do something. 
    return ostream; 
} 
6

運營商<<必須實施作爲一個自由的功能是有意義的:

//inside class definition 
//still free function 
friend std::ostream& operator<<(std::ostream &, const Histogram &) 
{ 
} 

或者,您也可以將其定義在類外。 (我喜歡這樣,因爲它將類功能組合在一起)

+3

不應該把'ostream&'也當作? – BoBTFish

+0

只有在函數內部被訪問的成員是'protected'或'private'時,它才需要成爲'friend'。同樣,它也應該把'ostream&'作爲輸入參數。 –

+0

@Als聲明它爲朋友可以讓你在類定義中實現它。我正是這個意思。 –

相關問題