2009-06-17 20 views
6

जब प्रश्न (this answer के आधार पर) के लिए एक उत्तर शोध मैं निम्नलिखित करने की कोशिश की:मैं टेम्पलेट पैरामीटर से मित्रता क्यों नहीं कर सकता?

template <class T> 
class friendly { 
    friend class T; 
}; 

friendly<string> howdy; 

यह निम्न त्रुटि के साथ संकलित करने के लिए विफल रहता है:

error: template parameter "T" may not be used in an elaborated type specifier friend class T;

मैं क्या से समझ सकता हूँ से मेरा अच्छा मित्र Google ऐसा इसलिए है कि मैं गलती से friendly<int> को तुरंत चालू करने की कोशिश नहीं करूंगा लेकिन टेम्पलेट को संकलित करते समय यह त्रुटि क्यों होनी चाहिए? टेम्पलेट को अमान्य प्रकार (जैसे मैंने लिखा था int f() { return T::foo(); })

+5

मित्रों और प्रभाव पैरामीटर कैसे बनाएं। – TheTXI

+1

यहां एक संबंधित प्रश्न है: http://stackoverflow.com/questions/392120/why-cant-i-declare-a-friend-through-a-typedef –

उत्तर

2

एक थोड़ा और अधिक विस्तारित friend घोषणाएं(PDF)C++0x के लिए लाया googleling।

इस दस्तावेज़ को निम्नलिखित शामिल हैं:

template <typename T> class R { 
    friend T; 
}; 
R<C> rc; // class C is a friend of R<C> 
R<int> ri; // OK: “friend int;” is ignored 

कौन सा मैं क्या सोचा (अवैध friend decelerations अनदेखी के बजाय इन्स्टेन्शियशन दौरान नाकाम रहने) से भी आगे चला जाता है। तो मुझे लगता है कि जवाब यह है कि कोई अच्छा कारण नहीं है और इसे ठीक किया जा रहा है।

3

मानक के धारा 7.1.5.3 स्पष्ट रूप से एक विकृत विस्तृत प्रकार विनिर्देशक के उदाहरण के रूप में इसका वर्णन करते समय एक त्रुटि नहीं होनी चाहिए।

विषय के बारे में एक चर्चा here पाया जा सकता है।

+0

+1, अच्छी खोज। मुझे इस बार के खिलाफ बटाई याद है। मुझे नहीं पता कि यह क्यों verboten है - शायद यह संकलक कार्यान्वयन के लिए कठिनाइयों का कारण बन गया? –

+1

बाइबल, बेटे से सवाल न करें। –

+0

मैंने संदर्भित धागे पर एक नज़र डाली और यह इंगित करने के अलावा कि यह अवैध है कि इस बारे में कोई अंतर्दृष्टि नहीं है (जो इस प्रश्न में मैं बाद में हूं)। – Motti

संबंधित मुद्दे