2010-05-18 13 views
8

मैं निम्नलिखित कोड है:एक टेम्पलेट का नाम टेम्पलेट पैरामीटर में नेस्ट का उल्लेख नहीं कर सकते

template <typename Provider> 
inline void use() 
{ 
    typedef Provider::Data<int> D; 
} 

कहाँ मैं मूल रूप से एक टेम्पलेट वर्ग के सदस्य कुछ 'प्रदाता' वर्ग के 'डाटा' का उपयोग करने की कोशिश कर रहा हूँ, लागू किया 'int' के लिए, लेकिन मुझे निम्न त्रुटियां मिलती हैं:

util.cpp:5: error: expected init-declarator before '<' token 
util.cpp:5: error: expected `,' or `;' before '<' token 

मैं सोलालिस सिस्टम पर जीसीसी 4.3.3 का उपयोग कर रहा हूं।

+0

[सी ++ टेम्पलेट वर्ग के टेम्पलेट सदस्य समारोह टेम्पलेट समारोह से कहा जाता है] (के संभावित डुप्लिकेट http://stackoverflow.com/questions/1840253/c-template -मेम्बर-फ़ंक्शन-ऑफ-टेम्पलेट-क्लास-कॉल-टेम्पलेट-फ़ंक्शन) –

+1

@ किरील: मुझे लगता है कि यह एक अद्वितीय है जिसमें इसे 'टाइपनाम' और 'टेम्पलेट' दोनों की आवश्यकता होती है। (मैं थोड़ी देर के लिए संघर्ष कर रहा था कि एक ही कोड का उपयोग करके इसे कैसे समझाया जाए और मैं संतुष्ट नहीं हूं।) – sbi

+0

@ एसबीआई, हाँ, यह वही सटीक नहीं है, लेकिन बहुत ही समान प्रश्न है। –

उत्तर

16
typedef typename Provider::template Data<int> D; 

समस्या यह है कि, जब compilers पहली बार के लिए use() पार्स करता है, यह Provider पता नहीं है, तो यह पता नहीं है क्या Provider::Data को संदर्भित करता है। यह एक स्थिर डेटा सदस्य, सदस्य फ़ंक्शन का नाम या कुछ और हो सकता है। यही कारण है कि आपको में
अतिरिक्त template आवश्यक है जब भी नेस्टेड नाम टेम्पलेट का नाम होता है। अगर यह कुछ और था, तो Data < ... तुलनात्मक हो सकता है।

+0

यह काम करता है। धन्यवाद! – chila

8

आप एक typename और एक template की जरूरत है:

template <typename Provider> 
inline void use() 
{ 
    typedef typename Provider::template Data<int> D; 
} 
+0

आपको भी धन्यवाद। – chila

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