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