错误C2248:'std :: basic_ios< _Elem,_Traits> :: basic_ios':无法访问类'std :: basic_ios< _Elem,_Traits>'中声明的私有成员

时间:2011-02-28 03:01:09

标签: c++

得到此错误,我非常确定它位于运算符<<功能。两张照片都是公开的。

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; 

3 个答案:

答案 0 :(得分:12)

您需要通过引用返回ostream,而不是值。它试图调用构造函数。 也可以通过'a'作为参考:

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;
}

答案 1 :(得分:5)

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

Streams不可复制,因此您无法按值返回。您需要通过引用(std::ostream&)返回流。

另外,您可能应该在sout函数中输出CRational::print(ostream&)(否则,为什么将其作为参数?)并且当您调用{时,您可能应该传递sout你的a.print()重载中的{1}}(否则,重载并不会真正实现流的惯用operator<<重载)。

答案 2 :(得分:2)

operator<<应该返回对ostream的引用:ostream& operator<< ...

你的功能也有点搞砸了。您应该使用已命名为cout的{​​{1}},而不是使用ostream