2017-09-13 99 views
-5

在編寫下面的代碼,我得到一個錯誤:爲什麼運營商<<無法成功運作?

Expression.h

class Expression{ 
    ... 
protected: 
    std::ostream Os; 
}; 

Expression.c

Expression::Expression() : Os(std::cout) 
{ 
    ... 
} 

Expression::Expression(std::ofstream &os) : Os(os) 
{ 
    ... 
} 

Expression::Dump() 
{ 
    Os << "=============================================================" << std::endl; 
    Os << "Os:    " << Os << std::endl; 
} 

error: no match for 'operator<<' (operand types are 'std::basic_ostream<char>' and 'std::ostream {aka std::basic_ostream<char>}')

什麼是我的錯?我應該怎麼做才能解決它?

雖然這樣的參數初始值Os(std::cout),這是什麼意思?

+4

您可以嘗試創建一個[最小,***完整***和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示?另請[請閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。 –

+5

你期望嘗試流出一個'ostream'來做什麼?尤其是將'ostream'流出來給自己? – BoBTFish

+0

'operator <<'的確如[文檔](http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2)那樣工作。看起來你沒有閱讀文檔,也沒有關心錯誤信息。 –

回答

1

錯誤是因爲沒有標準operator<<ostream到另一個ostream

此外,ostream不能從另一個ostream拷貝構造,因此,如果你想指定輸出ostreamExpression寫那麼你的Os成員需要被宣佈爲基準來代替。

class Expression { 
    ... 
protected: 
    std::ostream &Os; 
}; 

Expression::Expression() : Os(std::cout) 
{ 
    ... 
} 

Expression::Expression(std::ofstream &os) : Os(os) 
{ 
    ... 
} 

Expression::Dump() 
{ 
    Os << "=============================================================" << std::endl; 
    Os << "Os: " << SomethingThatIsNotOs << std::endl; 
} 
+0

我不同意第二句話。如果你定義了一些'std :: ostream&operator <<(std :: ostream&,std :: ostream&)' - 這會很奇怪 - 它不太可能產生無限遞歸 –

2

考慮

Os << "Os:    " << Os << std::endl; 

讓我們把它解壓到其全功能的榮耀:

std::ostream& t1 = Os.operator <<("Os:    "); 
std::ostream& t2 = t1.operator <<(Os);     // << Here 
std::ostream& t3 = t2.operator <<(std::endl); 

的問題是行標 「在這裏」。你正在爲自己傳輸一個ostream。這是無意義的。你想做什麼?

如果你正試圖輸出流的標識符,你應該使用的地址:如果您正試圖輸出流的內容到標準輸出

Os << "Os:    " << &Os << std::endl; 

,你需要做Os是ostringstream,然後輸出字符串緩衝區:

std::ostringstream Os; 
    ... 
    std::stdout << "Os:    " << Os.str() << std::endl; 

注意的迂腐:我相信我原線分解成函數調用和initializat離子在這種特殊情況下實際上是相同的(因爲沒有臨時對象 - 只有引用);一般來說,臨時工的壽命可能會有微妙的差異。