2013-08-13 8 views
5

मैं एक वर्ग टेम्पलेटआंशिक रूप से विशेष टेम्पलेट मित्र

template< typename G, int N > class Foo { /* ... */ }; 

मैं के लिए N=0 अन्य वर्ग के एक दोस्त होने के लिए विशेषज्ञता चाहते हैं, लेकिन मैं इसे का वाक्य विन्यास पता नहीं है (और मैं इसे नहीं मिला खुद बाहर)। मैंने कोशिश की:

template< typename T > 
class Bar { 
    template< typename G > friend class Foo< G, 0 >; 

    /* ... */ 
}; 

मैं किसी भी प्रकार जी Foo< G, 0 > के लिए चाहते हैं class Bar<T> के एक दोस्त होने के लिए। इसके लिए सही वाक्यविन्यास क्या है?

धन्यवाद!

उत्तर

2

सी ++ 03 में संभव नहीं है; सी ++ मानक 14.5.3/9 कहते हैं निम्नलिखित:

Friend declarations shall not declare partial specializations.

एक और जवाब में बताया गया है, इस समस्या के लिए कुछ समाधान हो सकता है, लेकिन आप के लिए पूछ रहे हैं विशिष्ट कार्यक्षमता है कि मानक में उपलब्ध नहीं है।

सौभाग्य से, सी ++ 11 आजकल काफी अच्छी तरह से समर्थित है, और टेम्पलेट उपनाम निर्दिष्ट करने की क्षमता के साथ, हम हासिल कर सकते हैं तो बस इस:

template <typename, typename> struct X{}; 

template <typename T> 
struct Y 
{ 
    template <typename U> using X_partial = X<T, U>; 
    template <typename> friend class X_partial; 
}; 
+3

यह जीसीसी के साथ संकलित, लेकिन बजना संस्करण 3.8 के साथ संकलित करने के लिए विफल रहता है। त्रुटि संदेश 'त्रुटि है:' X_partial 'के विभिन्न प्रकार के प्रतीक टेम्पलेट मित्र वर्ग X_partial; ' के रूप में परिभाषित किया गया है। – ScootyPuff

1

बिना सी ++ 11 मैं सबसे अच्छा आप कर सकते हैं लगता है एक नकली प्रकार उर्फ, कि कुछ कोड (निर्माता) duplicatation (जो वास्तविक समस्या आप प्रयास कर रहे हैं का समाधान नहीं हो सकता है) की आवश्यकता हो सकती है:

template< typename G, int N > class Foo { /* ... */ }; 

template<typename G> class FooAlias : public Foo<G, 0> { }; 

template< typename T > 
class Bar { 
    template< typename G > friend class FooAlias; 

    /* ... */ 
}; 
+0

नोट: 'टेम्पलेट <टाइपनाम जी> मित्र वर्ग FooAlias;' => यहां 'जी' अनावश्यक है। –

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