2011-02-28 41 views
8

獲取此錯誤,我很確定它在運營商< <功能。兩張照片都是公開的。錯誤C2248:'std :: basic_ios <_Elem,_Traits> :: basic_ios':無法訪問類中聲明的私人成員'std :: basic_ios <_Elem,_Traits>'

void CRational::print() const 
{ 
    print(cout); 
} 

void CRational::print(ostream & sout) const 
{ 
    if(m_denominator == 1) 
     cout << m_numerator; 
    else 
     cout << m_numerator << "/" << m_denominator; 
} 

ostream operator<<(ostream & sout,const CRational a) 
{ 
    a.print(); 

    return sout; 
} 

CRational operator++() // prefix ++x 
{ 
    m_numerator += m_denominator; 
    return *this; 
} 

in main: 
cout << "e before: " << e << ", \"cout << ++e\" : " << ++e << " after: " << e << endl; 
+0

感謝您的幫助。但是我遇到了一個新問題。當我使用這個函數時,數字以遞歸的方式向後打印。 – andrey 2011-02-28 04:54:58

回答

5
ostream operator<<(ostream & sout,const CRational a) 
    ^You are trying to return by value 

流是不可拷貝,所以你不能返回值之一。您需要通過引用返回流(std::ostream&)。

此外,你應該在你的CRational::print(ostream&)功能輸出到sout(否則,爲什麼把它作爲一個參數?),你可能應該通過sout當您在operator<<超負荷致電a.print()(否則,超載沒有按」實際上做一個流的超載應該是什麼樣的習慣operator<<)。

2

operator<<應該回歸到一個ostream參考:ostream& operator<< ...

而且你的功能有點混亂。您應該使用已命名爲sout的傳入ostream而不是使用cout

12

您需要通過引用返回ostream,而不是值。它試圖調用構造函數。 不妨通過「一」作爲參考,以及:

ostream& operator<<(ostream & sout,const CRational& a) 

我也注意到打印方式可能是錯的。它已將sout作爲流的名稱傳遞,但直接使用cout執行。它應該是

void CRational::print(ostream & sout) const 
{ 
    if(m_denominator == 1) 
     sout << m_numerator; 
    else 
     sout << m_numerator << "/" << m_denominator; 
} 
相關問題