मेरे पास एक कक्षा है जो टेम्पलेट प्रकार पैरामीटर (टीटीआरआईटीआईटी) लेती है। मैं एक टेम्पलेट टाइपसदस्यउपनाम टीटीआरआईटीआईटी से मित्र बनाना चाहता हूं, लेकिन मैं वाक्यविन्यास नहीं समझ सकता। (क्या यह भी संभव है?)। (friend
लाइन पर)सी ++: टेम्पलेट पैरामीटर के टेम्पलेट प्रकार के सदस्य को फेंकने के लिए सही वाक्यविन्यास?
template <bool bBOOL>
struct SFoo {};
struct STrait
{
template <bool bBOOL>
using TFoo = SFoo<bBOOL>;
};
template <typename tTRAIT>
struct SBar
{
template <bool bBOOL>
friend typename tTRAIT::template TFoo<bBOOL>;
};
SBar<STrait> bar;
बजना की त्रुटि है:
error: friend type templates must use an elaborated type
मैं सभी संभव संयोजनों मैं के बारे में सोच सकते हैं थकाऊ की कोशिश की है:
friend tTRAIT::TFoo;
friend tTRAIT::template TFoo;
friend typename tTRAIT::TFoo;
friend typename tTRAIT::template TFoo;
template <bool bBOOL> friend tTRAIT::TFoo;
template <bool bBOOL> friend tTRAIT::TFoo<bBOOL>;
template <bool bBOOL> friend tTRAIT::template TFoo;
template <bool bBOOL> friend tTRAIT::template TFoo<bBOOL>;
template <bool bBOOL> friend typename tTRAIT::TFoo;
template <bool bBOOL> friend typename tTRAIT::TFoo<bBOOL>;
template <bool bBOOL> friend typename tTRAIT::template TFoo;
template <bool bBOOL> friend typename tTRAIT::template TFoo<bBOOL>;
मैं भी using
उपयोग करने की कोशिश की है, लेकिन यह मदद करने के लिए प्रतीत नहीं होता है।
एक बदसूरत हैक (जो केवल बूल पैरामीटर के लिए काम करता है) के रूप में, मैं इसे प्रत्येक विशेषज्ञता को मैन्युअल रूप से तब्दील करके काम करने के लिए प्राप्त कर सकता हूं।
friend typename tTRAIT::template TFoo<false>;
friend typename tTRAIT::template TFoo<true >;
लेकिन यह भाग्यशाली है।
क्या कोई यह जानता है कि यह कैसे करें, या यदि यह किया जा सकता है?
खैर कि, दिलचस्प और कष्टप्रद है, क्योंकि मैं सक्रिय रूप से बजना के साथ "मैन्युअल रूप से दोस्त और सत्य झूठी विशेषज्ञताओं" उपयोग कर रहा हूँ (3.7.0/C++ 1Z) और यह निश्चित रूप से वास्तविक (गैर-उपनाम) प्रकार को फेंक रहा है। शायद यह मेरे लिए अवैध रूप से अच्छा रहा है? – xaxazak
संकलनकर्ता वर्गों और उनके आस-पास के कोड के विभिन्न संस्करणों को संकलित नहीं है (है ना?), एक वर्ग के लिए तो और यह उर्फ है, या तो दोनों निजी सामान या न कर सकते हैं देख सकते हैं (उनके कार्यों के लिए केवल एक ही साझा संस्करण ऐसा के बाद से)। आप उन्हें अलग नहीं कर सकते हैं। – xaxazak
मैनुअल friending के लिए, यह ठीक से काम करेंगे, क्योंकि उर्फ टेम्पलेट के इन्स्टेन्शियशन और स्वयं टेम्पलेट को ठीक उसी प्रकार किया जाएगा। यह केवल टेम्पलेट्स हैं जो अलग हैं, तत्काल नहीं हैं। – TartanLlama