2009-06-05 20 views
6

मैं निम्नलिखित सदस्य डेटासी ++ इटरेटर समस्याओं

vector<State<T>*> activeChildren; 

मैं साफ-अप करने के लिए मेरे नाशक में इन संकेत चाहते हैं

StateContainer<T>::~StateContainer() { 
    vector<State<T>*>::iterator it = 
     activeChildren.begin(); 
    while(it!=activeChildren.end()) { 
     State<T>* ptr = *it; 
     it = activeChildren.erase(it); 
     delete ptr; 
    } 
} 

मैं Ubuntu पर जी ++ 4.3.2 से निम्न त्रुटि मिलती है:

./fsm2/StateContainer.cpp: In destructor ‘virtual ervan::StateContainer<T>::~StateContainer()’: 
../fsm2/StateContainer.cpp:24: error: expected `;' before ‘it’ 
../fsm2/StateContainer.cpp:25: error: ‘it’ was not declared in this scope 

क्या कोई मुझे बता सकता है कि मैंने क्या गलत किया है? मैं दो और स्थानों पर जहां मैं iterator छोरों का उपयोग में इस त्रुटि मिलती है, लेकिन नहीं है जब मैं for_each (...)

+0

बूस्ट :: ptr_vector > –

उत्तर

20

फिर typename समय ऐसा लगता है कि का उपयोग करें - मुझे तुम्हारी जरूरत है लगता है:

typename vector<State<T>*>::iterator it = ... 

एक अनुमानी के लिए जी ++ उपयोगकर्ताओं - आप टेम्पलेट कोड में यह संदेश दिखाई जब:

expected `;' before ‘it’ 

यह एक बहुत अच्छा शर्त है कि की 'यह एक प्रकार के रूप में संकलक द्वारा नहीं देखा जा रहा है और इसलिए सामने बात एक की जरूरत है' टाइपनाम 'जोड़ा गया।

+0

का उपयोग करने के लिए एक अच्छी जगह की तरह दिखता है हम पिछली बार मेरे प्रश्न पर मिले जिसके लिए उत्तर * डिंग * * डिंग * टाइपनाम था! ;) – bobbyalex

+0

खैर मैंने पूछा कि इससे पहले मैंने इस तरह की त्रुटियों को खोजने का प्रयास किया था, लेकिन जी ++ वास्तव में अच्छी त्रुटियां नहीं देता है। मैंने वास्तव में सी ++ कभी नहीं सीखा है, मैं बस जिस तरह से मैंने उठाया है उसका उपयोग करता हूं। – KitsuneYMG

+0

@kts: मुझे नहीं लगता कि आपको खोज करके एक उत्तर खोजने की उम्मीद की जा सकती है - आपको उचित खोज क्वेरी के साथ आने के उत्तर को जानना होगा। –

5

यह एक पार्सिंग मुद्दा है। इस कोड में, vector<State<T>*>::iterator एक घोंसला आधारित प्रकार है।

जब तक आप नहीं जानते कि टी क्या है (और टी पार्स समय पर ज्ञात नहीं है), पार्सर/कंपाइलर को यह एहसास नहीं होता है कि इटरेटर एक प्रकार है (यह सभी स्थिर जानता है, एक स्थिर सदस्य चर हो सकता है)।

इसलिए, आपको कंपाइलर को यह बताने के लिए एक संकेत के रूप में टाइपनाम को परिभाषित करना होगा कि सभी vector<State<T>*>, vector<State<T>*>::iterator एक प्रकार का नाम है।

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