2011-02-28 1 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

답변

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

스트림은, 복사 가능한 없습니다. 스트림을 참조 (std::ostream&)로 반환해야합니다.

또한, 당신은 아마 (그렇지 않으면, 왜 인수?로 가져가) 당신의 CRational::print(ostream&) 기능에 sout에 출력해야하며, 당신이 당신의 operator<< 과부하에 a.print()를 호출 할 때 당신은 아마 sout을 통과해야한다 (그렇지 않으면 과부하은 '아무튼 스트림에 대해 과부하가되는 관용적 인 내용 인 operator<<을 실제로 수행합니다.

은 또한 당신의 기능을 좀 엉망 ... ostream& operator<< :

2

operator<<ostream에 대한 참조를 반환해야합니다. cout을 사용하는 대신 sout이라는 ostream에 전달 된 것을 사용해야합니다.

12

값이 아닌 참조로 ostream을 반환해야합니다. 그 생성자를 호출하려고.

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

또한 인쇄 방법은 아마 잘못 참고 : 뿐만 아니라 'A'는뿐만 아니라 참조로 전달할 수 있습니다. 스트림의 이름으로 sout이 전달되었지만 cout을 직접 사용하여 구현됩니다. 그래야합니다.

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