2011-02-28 12 views
8

में घोषित निजी सदस्य तक नहीं पहुंच सकता है यह त्रुटि प्राप्त करना और मुझे पूरा यकीन है कि यह है ऑपरेटर < < फ़ंक्शन। दोनों प्रिंट सार्वजनिक हैं।त्रुटि सी 2248: '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 

स्ट्रीम ताकि आप मूल्य से एक वापस नहीं लौट सकते, copyable नहीं हैं। आपको संदर्भ द्वारा स्ट्रीम को वापस करने की आवश्यकता है (std::ostream&)।

इसके अलावा, आप शायद अपनी CRational::print(ostream&) समारोह में sout करने के लिए outputting किया जाना चाहिए (अन्यथा, क्यों एक तर्क? के रूप में यह लेने के लिए) और आप शायद sout गुजर जाना चाहिए जब आप अपने operator<< अधिभार में a.print() फोन (अन्यथा, अधिभार नहीं करता ' वास्तव में एक स्ट्रीम के लिए एक idiomatic operator<< अधिभार क्या करना है)।

2

operator<< के लिए एक ostream एक संदर्भ लौटना चाहिए: ostream& operator<< ...

इसके अलावा अपने कार्यों थोड़े अव्यवस्थित हैं। cout का उपयोग करने के बजाय, आपको ostream में उत्तीर्ण किया जाना चाहिए जिसे आपने sout नाम दिया है।

12

आपको ओस्ट्रीम को संदर्भ द्वारा वापस करने की आवश्यकता है, मूल्य नहीं। यह एक कन्स्ट्रक्टर कॉल करने की कोशिश कर रहा है। रूप में अच्छी तरह से पारित सकता है 'एक' संदर्भ के रूप में रूप में अच्छी तरह:

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; 
} 
संबंधित मुद्दे