मैं templated कक्षाओं के साथ इस समस्या में भाग गया। यहाँ एक अधिक सामान्य समाधान मैं का इस्तेमाल किया था है:
template class <T>
class myClass
{
int myField;
// Helper function accessing my fields
void toString(std::ostream&) const;
// Friend means operator<< can use private variables
// It needs to be declared as a template, but T is taken
template <class U>
friend std::ostream& operator<<(std::ostream&, const myClass<U> &);
}
// Operator is a non-member and global, so it's not myClass<U>::operator<<()
// Because of how C++ implements templates the function must be
// fully declared in the header for the linker to resolve it :(
template <class U>
std::ostream& operator<<(std::ostream& os, const myClass<U> & obj)
{
obj.toString(os);
return os;
}
अब: * मेरी toString() समारोह इनलाइन अगर यह सीपीपी में रखा जा रहा है नहीं हो सकता। * आप हेडर में कुछ कोड से फंस गए हैं, मैं इससे छुटकारा नहीं पा सका। * ऑपरेटर toString() विधि को कॉल करेगा, यह रेखांकित नहीं है।
ऑपरेटर का शरीर < < को मित्र क्लॉज या कक्षा के बाहर घोषित किया जा सकता है। दोनों विकल्प बदसूरत हैं।:(
शायद मैं गलत समझ रहा हूँ या कुछ याद आ रही है, लेकिन सिर्फ आगे की घोषणा ऑपरेटर टेम्पलेट जीसीसी में से नहीं जुड़ता है
यह भी काम करता है:।
template class <T>
class myClass
{
int myField;
// Helper function accessing my fields
void toString(std::ostream&) const;
// For some reason this requires using T, and not U as above
friend std::ostream& operator<<(std::ostream&, const myClass<T> &)
{
obj.toString(os);
return os;
}
}
मुझे लगता है कि आप भी कर सकते हैं templating मुद्दों हेडर में घोषणाओं के लिए मजबूर है, यदि आप एक माता पिता के वर्ग है कि ऑपरेटर < < लागू करने के लिए टेम्प्लेट की नहीं है का उपयोग करने से बचने, और एक आभासी toString का उपयोग() विधि।
स्रोत
2017-06-23 02:27:18
इसके अलावा, वह के रूप में एक दोस्त समारोह में यह घोषणा करता है, और यह परिभाषित करता है एक के रूप में मेबर समारोह। – asaelr