我試圖創造出既具有過載operator<<
和operator>>
友元函數,和的operator std::string
方法,像這樣一類:我可以明確定義流運算符和轉換運算符嗎?
class MyClass
{
public:
operator std::string()
friend std::istream& operator>>(std::istream&, const MyClass&);
friend std::ostream& operator<<(std::ostream&, const MyClass&);
};
我覺得是我的編譯器抱怨「曖昧超載「當我嘗試使用它們時,流操作符的」我認爲這是因爲如果我這樣寫:
myStream << MyClass();
編譯器不知道是否使用operator<<
爲MyClass
,或使用operator std::string
爲MyClass
,然後再使用operator<<
爲std::string
(定義在標準庫中)寫入流中。
這究竟是原因嗎?如果是這樣,有什麼辦法可以解決它嗎?我知道在C++ 11中,您可以在轉換運算符上使用explicit
關鍵字來防止隱式轉換,但我正在處理的項目目前編譯爲C++ 03。
您能否提供[最小化,完整,可驗證示例](http://www.stackoverflow.com/help/mcve)。 'operator <<'應該是明確的首選。你使用什麼編譯器? – Barry
您需要展示實際展現您問題的完整代碼的小樣本。假設mystream是std :: ostream(或從std :: ostream派生的類型),那麼您的示例(除了需要添加缺少的分號幷包含所需的標準標頭外)不會顯示您描述的問題。自從1998年以來,所有C++標準都是如此。您的代碼中有一些其他貢獻者可能並未顯示(可能),或者您的編譯器不以相關方式遵守標準(可能,但相對不太可能)。 – Peter