2011-02-28 80 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; 
} 
相关问题