यह भाषा के एक मुश्किल पहलू के बारे में सिर्फ एक चेतावनी है। जब आप friend
फ़ंक्शन घोषित करते हैं, तो यह घोषणा के वर्ग का सदस्य नहीं है। आप इसे सुविधा के लिए वहां परिभाषित कर सकते हैं, लेकिन यह वास्तव में नामस्थान से संबंधित है।
एक दोस्त समारोह जो एक टेम्पलेट नहीं है, एक वर्ग टेम्पलेट के अंदर की घोषणा, अभी भी नाम स्थान में एक गैर टेम्पलेट समारोह की घोषणा की। यह न तो वर्ग का सदस्य है, न ही स्वयं एक टेम्पलेट है। हालांकि, यह वर्ग टेम्पलेट द्वारा उत्पन्न है।
टेम्पलेट से गैर-टेम्पलेट फ़ंक्शंस उत्पन्न करना थोड़ा आलसी है। उदाहरण के लिए, आप class
ब्लॉक के बाहर उस फ़ंक्शन के लिए घोषणा नहीं जोड़ सकते हैं। इसलिए आपको इसे class
ब्लॉक के अंदर भी परिभाषित करना होगा, जो समझ में आता है क्योंकि क्लास टेम्पलेट इसे उत्पन्न करेगा।
दोस्तों के बारे में एक और मुश्किल बात यह है कि class Float {}
के अंदर घोषणा नामस्थान में फ़ंक्शन घोषित नहीं करती है। आप इसे केवल तर्क-निर्भर अर्थ ओवरलोड रिज़ॉल्यूशन के माध्यम से ढूंढ सकते हैं, यानी यह निर्दिष्ट करते हुए कि एक तर्क में Float
(या संदर्भ या सूचक) टाइप किया गया है। यह operator+
के लिए कोई मुद्दा नहीं है, क्योंकि इसे किसी भी तरह अधिभारित होने की संभावना है, और उपयोगकर्ता-परिभाषित प्रकारों को छोड़कर इसे कभी भी नहीं बुलाया जाएगा।
में कोई समस्या का एक उदाहरण के लिए, कल्पना आप एक रूपांतरण निर्माता Float::Float(Bignum const&)
है। लेकिन Bignum
में operator+
नहीं है। (क्षमा करें, प्रदूषित उदाहरण।) आप पर Bignum
अतिरिक्त पर भरोसा करना चाहते हैं। अब my_bignum + 3
संकलित नहीं होगा क्योंकि न तो ऑपरेंड Float
है इसलिए इसे friend
फ़ंक्शन नहीं मिल रहा है।
शायद, आप, के बारे में चिंता करने के लिए जब तक प्रश्न में समारोह एक operator
है के रूप में कुछ भी नहीं है।
या, आप friend
बदल टेम्पलेट के रूप में अच्छी तरह से हो सकता है। उस मामले में, यह बजाय घोषित किया जा करने की जरूरत के बाहर परिभाषित किया जाना चाहिए class {}
ब्लॉक, और यह पहले की घोषणा की, और अंदर परिभाषित किया।
template<int E, int F> // now this is a template!
Float<E, F> operator+ (const Float<E, F> &lhs, const Float<E, F> &rhs);
template<int E, int F>
class Float
{
// deduce arguments E and F - this names operator+< E, F >.
friend Float<E, F> operator+<> (const Float<E, F> &lhs, const Float<E, F> &rhs);
};
आप http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16 पढ़ने के लिए – UncleBens