2015-05-27 4 views
6

मैं using निर्देश का उपयोग करने के लिए public किसी व्युत्पन्न वर्ग की पहुंच घोषणा को आधार में घोषित कुछ आंतरिक वर्ग टेम्पलेट में लाने का प्रयास कर रहा हूं। कोड:एक निजी विरासत आंतरिक टेम्पलेट को एक प्रयोग निर्देश के माध्यम से सार्वजनिक बनाना

template <typename T> 
class Base 
{ 
public:  
    template<typename U> 
    struct Inner; 
}; 

template<typename T> 
class Derived: private Base<T> 
{ 
public: 
    using typename Base<T>::template Inner; // make it visible 
    Inner<T>* ptr; // no need for typename here, non-qualified name 
}; 

int main() {} 

न तो जी ++ और न ही बजना ++ इस कोड संकलन, दोनों में शिकायत के बारे में

error: expected unqualified-id before 'template'

जहाँ तक मुझे पता है, Inner एक आश्रित टेम्पलेट का नाम है, इसलिए एक ::template का उपयोग करना चाहिए जब कि इसके नाम से योग्यता, और typename इससे पहले, Base<T>::Inner एक आश्रित प्रकार है। मैंने typename/template के साथ/बिना सभी संभव संयोजनों का प्रयास किया है, और कोई भी संकलित नहीं है। के public अनुभाग में Inner का उपयोग करने का कोई तरीका है?

+0

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#109 –

+0

@ T.C। "- टेम्पलेट 'के साथ लिखा जा सकता है? – Barry

+0

@ बैरी नोट करें कि उस समस्या का मूल उदाहरण सदस्य फ़ंक्शन टेम्पलेट के लिए था। –

उत्तर

10

संभव नहीं है। एक वर्ग टेम्पलेट नहीं किया जा सकता

using typenameoptnested-name-specifierunqualified-id ;

लेकिन एक अयोग्य-आईडी: एक का उपयोग कर-घोषणा [namespace.udecl] से, है।

तुम बस के बजाय एक उपनाम बना सकता है:

template<typename T> 
class Derived: private Base<T> 
{ 
public: 
    template <typename U> 
    using Inner = typename Base<T>::template Inner<U>; 

    Inner<T>* ptr; 
}; 
+0

धन्यवाद! यह काम करता है, मुझे लगता है कि सी ++ 98/03 के लिए आप भाग्य से बाहर हैं ... – vsoftco

+0

क्यों * अयोग्यता-आईडी * कक्षा टेम्पलेट नहीं हो सकता है? AFAIK, 'आंतरिक 'एक अयोग्य आईडी है, और यह एक वर्ग टेम्पलेट है। – vsoftco

+0

@ vsoftco बस व्याकरण से, कहीं भी 'टेम्पलेट' कीवर्ड के लिए कोई भत्ता नहीं है। 'बेस का उपयोग करके :: टेम्पलेट इनर ' स्पष्ट रूप से अस्वीकृत है क्योंकि यह एक * टेम्पलेट-आईडी * है। आप ':: इनर;' का उपयोग कर कर सकते हैं, लेकिन यह वास्तव में आपकी मदद नहीं करता है इसलिए मैं पूरी तरह से यह सुनिश्चित नहीं करता कि यह क्या करता है। – Barry

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