2010-02-17 18 views
5

यह है एक वर्ग टेम्पलेट का एक टुकड़ा जो खड़ी कर रहा है संकलन त्रुटियों:उम्मीद नेस्टेड-नाम-विनिर्देशक से पहले 'sktraits'

/* Secondary index class */ 
template<class TKey, class TVal, class key_traits, class val_traits> 
template<class TSecKey, class sktraits> 
class CBtreeDb<TKey, TVal, key_traits, val_traits>::CDbSecondaryIndex: protected CBtreeDb<TKey, TVal>, public IDeallocateKey 
{ 
public: 
typedef TSecKey   skey_type; 
typedef typename sktraits       skey_traits; 
typedef CNewDbt<TSecKey, sktraits>    CDbSKey; 
typedef typename iterator_t<TSecKey, skey_traits> iterator; 
typedef typename iter_lower_bound_t<skey_type> iter_lower_bound; 
typedef typename iter_upper_bound_t<skey_type> iter_upper_bound; 

CDbSecondaryIndex(CDbEnv* pEnv, u_int32_t flags, bool bAllowDuplicates=false): 
    CBtreeDb(pEnv, flags, bAllowDuplicates) 
{ 

} 

    // Class implementation continues ... 
}; 

संकलक त्रुटि संदेश मैं मिलता है:

expected nested-name-specifier before 'sktraits'. 

असल में यह त्रुटि हर typedef घोषणा typename

द्वारा पीछा किया पर होता है मैं एक्स पर VS2005 और VS2008 का उपयोग कर अतीत में सफलतापूर्वक इस कोड को संकलित किया है पी

मैं वर्तमान में, Ubuntu 9.10 पर निर्माण कर रहा हूँ, जीसीसी 4.4.1

मैं गूगल पर इस त्रुटि को देखा और ऐसा लगता है कि typename लाइन (जहां त्रुटि तब होती है) पर आवश्यक नहीं है का उपयोग कर, क्योंकि मानक धारणा यह है कि उस स्थिति में एक पहचानकर्ता एक प्रकार है। g ++ शिकायत कर रहा है क्योंकि यह योग्यता प्राप्त करने के लिए typename घोषणा की अपेक्षा करता है (यानी ए :: बी)।

क्या यह समस्या का सही निदान है - यदि हां, तो मैं typename कैसे "पूरी तरह अर्हता प्राप्त करूं"?

संक्षेप में, मैं इस समस्या को कैसे हल कर सकता हूं?

+0

मैं इसे ठीक करने में कामयाब रहा (यानी संकलन करने के लिए कोड प्राप्त करें) - टाइपडेफ घोषित करने वाले 'टाइपनाम' को हटाकर। हालांकि हेडर अब सफलतापूर्वक संकलित है, मैं अभी भी संतुष्ट नहीं हूं क्योंकि मैं अंतर्निहित जानना चाहता हूं (यानी तकनीकी कारण) मुझे टाइपनाम को क्यों हटा देना था (विशेष रूप से, जब एसटीएल कक्षाओं में समान नोटेशन का उपयोग किया जाता है) –

उत्तर

0

निम्नलिखित अनुमति नहीं है:

template<class A> 
template<class B> class F { ... }; 

आप कर सकते हैं इससे पहले कि एक वर्ग/समारोह परिभाषा सबसे एक template<> विनिर्देश पर।

+0

कृपया समझाएं। Comau लोग असहमत: http: //www.comeaucomputing।com/techtalk/templates/# outsidedef - मेरे पास कोई मानक काम नहीं है लेकिन कमौ बहुत विश्वसनीय wrt मानकों का अनुपालन है। –

+0

मानक 14.5.2/1 में कहता है: "क्लास टेम्पलेट का एक सदस्य टेम्पलेट जो कि अपनी कक्षा टेम्पलेट परिभाषा के बाहर डिफाईड किया गया है, क्लास टेम्पलेट के टेम्पलेट-पैरामीटर के साथ निर्दिष्ट किया जाएगा, इसके बाद सदस्य टेम्पलेट के टेम्पलेट-पैरामीटर ", और एक उदाहरण देता है: 'टेम्पलेट टेम्पलेट int स्ट्रिंग :: तुलना करें (कॉन्स टी 2 और एस)'। –

7

typename यह निर्दिष्ट करने के लिए आवश्यक है कि निर्भर नाम वास्तव में एक प्रकार है। आपके नाम आश्रित नाम नहीं हैं, इसलिए typename आवश्यक या अनुमति नहीं है।

typename-विशिष्ट एर:
    typename नेस्टेड-नाम-विशिष्ट एर पहचान फाई एर
    typename nested-

अद्यतन मानक वास्तव में इस वाक्य रचना परिभाषा है नाम-विशिष्टताटेम्पलेट ऑप्ट सरल-टेम्पलेट आईडी

दो अन्य स्थानों पर आप typename कीवर्ड का उपयोग कर सकते हैं (उत्तरार्द्ध मामले में यह भी एक से पालन किया जाना चाहिए में टेम्पलेट पैरामीटर सूची में और using घोषणा में हैं नेस्टेड नाम विनिर्देशक)।

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