2015-04-18 55 views
2

我試圖創造出既具有過載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::stringMyClass,然後再使用operator<<std::string(定義在標準庫中)寫入流中。

這究竟是原因嗎?如果是這樣,有什麼辦法可以解決它嗎?我知道在C++ 11中,您可以在轉換運算符上使用explicit關鍵字來防止隱式轉換,但我正在處理的項目目前編譯爲C++ 03。

+0

您能否提供[最小化,完整,可驗證示例](http://www.stackoverflow.com/help/mcve)。 'operator <<'應該是明確的首選。你使用什麼編譯器? – Barry

+0

您需要展示實際展現您問題的完整代碼的小樣本。假設mystream是std :: ostream(或從std :: ostream派生的類型),那麼您的示例(除了需要添加缺少的分號幷包含所需的標準標頭外)不會顯示您描述的問題。自從1998年以來,所有C++標準都是如此。您的代碼中有一些其他貢獻者可能並未顯示(可能),或者您的編譯器不以相關方式遵守標準(可能,但相對不太可能)。 – Peter

回答

1

首先,自1998年標準以來,關鍵字顯式已經存在。你確定你的編譯器不支持它嗎?

而且,我懷疑你的解釋,因爲表達的std ::法院< < MyClass的()是你的運營商< <與>>的過載的完美匹配,假設你的「myStream」是相應的流型。完美匹配優先於任何需要用戶定義的轉換的匹配。事實上,下面的代碼對我來說編譯得很好。你正在使用哪種編譯器?

class MyClass { 
public: 
    operator std::string(); 

    friend std::istream& operator>>(std::istream&, const MyClass&); 
    friend std::ostream& operator<<(std::ostream&, const MyClass&); 
}; 

void just_do_it() 
{ 
    std::cout << MyClass(); 
} 
+0

我相信OP正在討論關於轉換運算符(不是關於構造函數的'explicit')的'explicit',這在C++ 11中是新的,參見[here](http://en.cppreference.com/w/) CPP /語言/顯式)。 –

+0

這很可能是詹姆斯的情況。謝謝。無論如何,除非他的'myStream'出現問題,否則在找到匹配超載時我不會看到任何可能的含糊之處。 – Liondance

+0

只是在一般情況下進行測試並不足以驗證預期結果。編譯器可以以不同的方式實現,或者可能存在未定義的行爲。所以只是說「編譯看看」在我的書中並不是真正的有效答案。 – Rapptz