2011-07-19 3 views
10

मैं एक आंतरिक उपयोगिता वर्ग के साथ एक टेम्पलेट वर्ग बनाने रहा हूँ। टेम्पलेट के सभी विशेषज्ञताओं ही भीतरी वर्ग हैं:क्या एक टेम्पलेट वर्ग का एक आंतरिक वर्ग गैर-टेम्पलेट वर्ग हो सकता है?

template<...> class Outer { 
    class Inner { }; 
}; 

जो मुझे Outer<...>::Inner देता है, लेकिन मैं, सभी Inner एक ही प्रकार होना चाहता हूँ के रूप में अगर मैं सिर्फ लिखा था:

class Inner { }; 
template <...> class Outer { }; 

या यदि

class Outer { 
    class Inner { }; 
}; 

मुझे Outer::Inner दे रही है: Outer बस एक टेम्पलेट वर्ग नहीं थे। मैं अगर है कि संभव है (बस नाम स्थान/स्पष्टता कारणों के लिए) सभी Outer<> के लिए Outer::Inner काम करना चाहते हैं। अन्यथा मैं बस Inner बाहर ले जा सकता हूं।

+1

मैं काफी कुछ जवाब नहीं है, लेकिन मैं किसी को आशा करती हूं कि मुझे क्योंकि मैं गलत साबित होता है इसी तरह की स्थिति में होने की हो :) –

+1

मैं कर रहा हूँ केवल * काफी * कुछ जवाब नहीं है, लेकिन मैं चतुर समाधान के लिए आशा करती हूं कि बहुत ... –

उत्तर

15

नेस्टेड वर्ग एक गैर टेम्पलेट हो सकता है, लेकिन क्योंकि वे (अन्यथा) असंबंधित प्रकार कर रहे हैं टेम्पलेट के हर इन्स्टेन्शियशन अपनी ही नेस्टेड वर्ग होगा। आप क्या कर सकते हैं

namespace detail { 

class Inner {}; 

} // detail 

template<...> 
class Outer { 
    typedef detail::Inner Inner; 
}; 
+0

स्वच्छ और सेक्सी समाधान –

+0

मैं अपने नाम स्थान विवरण भूल रहा - कर सकते हैं ' कक्षा आंतरिक 'छुपाया जा सकता है, अब, जैसे यह एक "सच" आंतरिक कक्षा में है? या कोड सहित कोई भी इसमें सक्षम होगा? – Nate

+0

@Nate उपरोक्त किसी भी 'टाइपपीफ' के साथ व्यवहार करता है। 'Inner' केवल एक घोषणा है कि यह भी एक परिभाषा (अर्थात' वर्ग इनर; ') नहीं है के साथ अधूरा छोड़ा जा सकता है, सभी चेतावनियां कि इसका अर्थ है के साथ। लेकिन इसे घोषित किया जाना चाहिए (नाम 'विवरण :: इनर' को कुछ संदर्भित करना चाहिए), अन्यथा इसे' typedef''d नहीं किया जा सकता है। –

0

यह आउटर से प्रत्येक इन्स्टेन्शियशन के लिए अद्वितीय हो जाएगा। यानी,

Outer<int>::Inner will be a different type from Outer<double>::Inner 
+1

यह तथ्य ओपी को अच्छी तरह से जाना जाता है क्योंकि उसने स्पष्ट रूप से अपनी समस्या में यह कहा है –

13

तरह से मैं अतीत में इस किया है वंशानुक्रम का उपयोग किया जाता है:

class DummyBase{ 
protected: 
    class Inner{ 
     //etc... 
    }; 
}; 

template<...> class Outer : public DummyBase{ 
    //etc... 
}; 
+0

+1 यह चालाक है, लेकिन मुझे ल्यूक का उत्तर अधिक पसंद है। –

+1

+1, क्योंकि इस बनाता है 'बाहरी <> :: Inner' कोई वास्तविक वर्ग के नाम। तो 'कक्षा बाहरी <> :: आंतरिक x; 'या' मित्र वर्ग बाहरी <> :: आंतरिक; 'अभी भी काम करेगा, जबकि' typedef' समाधान वहां विफल हो जाएगा। –