क्या किसी भी तरह से आंशिक टेम्पलेट विनिर्देश को मित्र वर्ग बनाना संभव है? अर्थात। विचार आप निम्नलिखित टेम्पलेट वर्गसी ++ टेम्पलेट्स: आंशिक टेम्पलेट विनिर्देशों और मित्र वर्ग
template <class T> class X{
T t;
};
अब आप आंशिक विशेषज्ञताओं है, उदाहरण के लिए, संकेत के लिए है
template <class T> class X<T*>{
T* t;
};
क्या मैं करना चाहते है कि हर संभव X<T*>
किसी के लिए X<S>
के एक दोस्त वर्ग है S
। अर्थात। X<A*>
X<B>
का मित्र होना चाहिए।
, मैं के बारे में एक्स में एक सामान्य टेम्पलेट दोस्त घोषणा सोचा:
template <class T> class X{
template <class S> friend class X<S*>;
}
बहरहाल, यह संकलन नहीं करता है, जी ++ मुझे यह बताता है:
test4.cpp: 34: 15: त्रुटि : 'template<class T> class X
' की विशेषज्ञता नाम स्थान दायरे में दिखाई देना चाहिए
test4.cpp: 34: 21: त्रुटि: आंशिक विशेषज्ञता 'X<S*>
' घोषित 'मित्र'
क्या यह बिल्कुल संभव नहीं है या क्या कुछ कामकाज है?
कारण है कि मैं पूछ रहा हूँ कि मैं X<T*>
में एक निर्माता है कि एक मनमाना X<S>
से इस वर्ग बनाता है (S
T
की एक उप-प्रकार होना चाहिए) की जरूरत है।
कोड इस तरह दिखता है:
template <class T> class X<T*>{
T* t;
template<class S>
X(X<S> x) : t(&(x.t)) {} //Error, x.t is private
}
अब, संकलक ज़ाहिर है, की शिकायत है कि x.t
के बाद से यह निजी है निर्माता में दृश्यमान नहीं है। यही कारण है कि मुझे आंशिक विशेषज्ञता मित्र वर्ग की आवश्यकता है।
क्या वास्तव में प्रश्न से बाहर 'get' फ़ंक्शन है? यह मेरे लिए बहुत साफ दिखता है और सभी टेम्पलेट मित्र पागलपन से बचाता है। – pmr
यह शायद इस उदाहरण में काम करेगा। हालांकि, ऐसा डेटा हो सकता है जो जनता के सामने नहीं आना चाहिए बल्कि केवल टेम्पलेट विशेषज्ञता के लिए। सवाल यह है कि अगर यह व्यवहार किसी भी तरह से संभव है। – gexicide