2009-10-15 17 views
5

की सूची में पुनरावृत्ति करना फिर भी मैं खुद को सी ++ वाक्यविन्यास से जूझ रहा हूं।सी ++: जेनेरिक प्रकार

मैं सामान्य वस्तुओं की सूची में पुन: प्रयास करने की कोशिश कर रहा हूं। मेरे पास कक्षा Event<Q> की ऑब्जेक्ट्स हैं, जो std::list<Event<Q> > में क्रैम की गई हैं।

तो मैं सूची पर एक इटरेटर पाने के लिए कोशिश कर रहा हूँ और intuitively सोचा कि

std::list<Event<Q> >::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 

समस्या का समाधान करना चाहिए। हालांकि, मैं इन त्रुटियों को प्राप्त करता रहता हूं:

..\calendar.h:48: error: expected `;' before "it" 
..\calendar.h:49: error: `it' was not declared in this scope 

क्या यह मुश्किल होने का कोई कारण है?

+1

क्या आप जो त्रुटियां प्राप्त कर रहे हैं, उनके बारे में अधिक विशिष्ट हो सकते हैं? –

+0

... और थोड़ा और कोड, शायद। 'घटनाओं' को तत्काल कैसे किया जाता है? – peterchen

उत्तर

8

निश्चित रूप से यह काम करना चाहिए, लेकिन ऐसा लगता है कि आपके पास या तो कार्रवाई में से एक या दोनों हैं।

  • Q एक टेम्पलेट पैरामीटर या एक प्रकार है जो किसी अन्यथा अन्यथा इस पर निर्भर करता है (इसे टाइप किया गया है)। को std::list से पहले रखें, ताकि संकलक जानता है कि ::iterator एक प्रकार है और विश्लेषण ठीक से आगे बढ़ सकता है (यह एक स्थिर मूल्य सदस्य हो सकता है)। यह जानना एक प्रकार है, संकलक टेम्पलेट परिभाषाओं के लिए बेहतर निदान का उत्पादन कर सकता है, और आपको यह बताने की आवश्यकता है कि यह typename का उपयोग कर एक प्रकार है या नहीं।
  • events एक कॉन्स सूची है। तब const_iterator का उपयोग करें।

अद्यतन: दिखाया संकलन त्रुटि निश्चित रूप से इंगित करता है कि पहला बिंदु सत्य है: Q प्रत्यक्ष या परोक्ष रूप टेम्पलेट पैरामीटर पर निर्भर करता है, और यदि आप ऐसा तरह typename डाल करने के लिए है:

typename std::list< Event<Q> >::iterator it; 

कंपाइलर का मानना ​​है कि यह एक गैर-प्रकार है, और इसलिए इसे ::iterator (जैसे एक गुणा) के पीछे कुछ ऑपरेटर या अर्धविराम की आवश्यकता होती है। typename को यह जानने के लिए कि इसे इसके बजाय एक प्रकार का नाम दें।

अद्यतन: समान टेम्पलेट मुद्दों और समाधानों के लिए Template FAQ देखें।

+0

बहुत बहुत धन्यवाद, जिसने इसे हल किया।मैंने किया था: 'typename std :: सूची > :: iterator it' और यह जादुई चारों ओर क्यू xD – Nubsis

+0

इवेंट <> हिस्सा उफ़ मैं याद किया काम खुशी है कि यह काम करता है :) –

+0

आपका स्पष्टीकरण बहुत स्पष्ट अर्थ है और यह भी हल था मेरी समस्या :) बहुत धन्यवाद, जोहान्स! –

0

आपके नमूने में, एस क्या है?

list<Event<S> >::iterator it; // what is S 
for (it = events.begin(); it != events.end(); it++) { ... } 

क्या आप वहां मूल प्रकार डालने का प्रयास कर सकते हैं?

list<Event<int> >::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 

या इसे और भी सरल बनाते हैं?

list<int>::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 
0

क्या आपको स्टडी नेमस्पेस आयात किया गया है? अगर इटेटरेटर घोषणा होनी चाहिए:

std::list<Event<S> >::iterator it; 
संबंधित मुद्दे