2013-03-27 73 views
0

所以昨天我問了這個問題private friend operator<< 關於如何讓operator<<私人的類。我得到了一個非常好的答案, 完全按照我的意願工作,但我還有一些其他問題。私人朋友運營商的代理類<<

首先,我不明白代理類怎麼不一定是朋友private_printable?我如何可以從operator<<以內訪問private_printable的內部成員?

其次,雖然從答案的代碼打,我寫了這個:

operator proxy() const { return *this; } 

起先似乎確定了我,它甚至編譯,但是當我運行它,並得到了段錯誤 我意識到,我還沒有爲代理類定義任何構造函數, 將採用private_printable作爲參數,從而允許轉換。 那麼,我的代碼如何編譯,甚至沒有給我任何警告?

然後我做的第三件事是給代理一個構造函數,它的參數 到private_printable作爲它的參數(我沒有明確說明)而不是定義轉換運算符。 現在一切正常,除了再次有可能撥打operator<<private_printable。但我不確定,爲什麼發生這種情況。 是因爲ADL嗎?我對此有一些模糊的理解,但我不確定其所有細節。無論如何,proxy類是私人的,那麼爲什麼 ADL有什麼不同?

回答

1
  1. ,因爲它是一個private_printablefriend可以operator<<訪問private_printable成員。這不是proxyfriend

  2. return *this返回一個private_printable對象,必須將其隱式轉換爲proxy。如何把private_printable轉換成proxy?致電private_printable::operator proxy()。但是,這是我們已經在的功能!段錯誤是由無限遞歸堆棧溢出引起的。對於它的價值,無限循環將是另一個可能的結果。

  3. 非易失explicit構造也是一個轉換功能,服務於相同的目的operator proxy。 ADL是涉及到的,就像使用了operator proxy並且沒有構造函數一樣。當然,解決方案是使構造函數explicit。只有在構造函數的唯一操作數是代理類的情況下,該問題纔會發生。

proxy類是一個private成員只有當你明確地將其命名爲重要。 ADL仍然可以使用proxy參數找到一個函數,然後間接導致訪問轉換函數,因爲使用類類型不受訪問限定的影響。只有名稱查找受到影響。同樣,如果您只有typedef,您總是可以使用private成員類型。

+0

再次感謝您的幫助,現在我清楚了:) – jcxz 2013-03-27 16:23:52