2011-06-10 5 views
25

निम्नलिखित कोड:सी ++: नेस्ट टेम्पलेट वर्गों त्रुटि "गैर नाम स्थान दायरे में स्पष्ट विशेषज्ञता"

prog.cpp:7:13: error: explicit specialization in non-namespace scope 'struct A1<T1>' prog.cpp:8:10: error: template parameters not used in partial specialization:
prog.cpp:8:10: error: 'T1'

कैसे मैं सबसे अच्छा इस त्रुटि को हल करने के है:

template <class T1> 
struct A1 
{ 
    template <int INDEX> 
    struct A2 { /* ... */ }; 

    template <> 
    struct A2<-1> { /* ... */ }; 
}; 

int main() 
{ 
    A1<int>::A2<-1> x; 
} 

इस त्रुटि देता है? मैंने यह कोशिश की:

template <class T1> 
struct A1 
{ 
    template <int INDEX, class DUMMY = void> 
    struct A2 { /* ... */ }; 

    template <class DUMMY> 
    struct A2<-1, DUMMY> { /* ... */ }; 
}; 

int main() 
{ 
    A1<int>::A2<-1> x; 
} 

जो काम करने लगता है लेकिन यह भी एक झगड़ा जैसा लगता है।

क्या इस के आसपास काम करने का एक बेहतर तरीका है?

मैंने पिछले उत्तरों को देखा है और केवल कक्षाओं में कक्षाओं के साथ कक्षाओं में कार्यों के साथ ही उन्हें ढूंढ सकते हैं। मुझे अन्य उत्तरों में "डमी" चाल भी मिली लेकिन यह सोच रहा था कि कोई अच्छा समाधान है या नहीं।

इसके अलावा, एक साइड नोट के रूप में, सी ++ 0x द्वारा अनुमत पहला कोड है?

+0

खाका विशेषज्ञताओं नाम स्थान दायरे में होना है, इसलिए संकलक आप 'टेम्पलेट struct A1 :: ए 2 <-1> {} की तरह कुछ करने के लिए उम्मीद कर रही है;' struct A1 परिभाषा के बाद, लेकिन है कि या तो काम नहीं करता। मुझे इसका जवाब देखने में बहुत दिलचस्पी है। एक sidenote पर, दृश्य सी ++ आपके कोड की अनुमति देता है, लेकिन यह मान्य मानक सी ++ नहीं है। – Sven

उत्तर

11

को A1 (§ 14.7.3/18) के बिना स्पष्ट रूप से विशेषज्ञता देने की अनुमति नहीं है। सी ++ 0x में एक ही प्रतिबंध है (एन 3242 § 14.7.3/16)। उसी पल में एक नेस्टेड वर्ग की आंशिक विशेषज्ञता की अनुमति है। तो एक डमी वर्ग के साथ चाल ठीक है।

+2

इस कोड को अनुमति देने वाले मानक के पीछे तर्क क्या है? चूंकि अन्यथा एक कंपाइलर त्रुटि है, मानक क्यों नहीं बल्कि मानक "डमी" टेम्पलेट्स को प्रभावी रूप से सम्मिलित करने के लिए संकलक को निर्देशित करेगा? – Clinton

+0

@ क्लिंटन, [यह] जांचें (http://stackoverflow.com/questions/2537716/why-is-partial-specialziation-of-a-nested-class-template-allowed-while-complete) प्रश्न। –

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