2011-04-18 27 views
6

मैंने अभी जीसीसी 4.6.0 संकलित किया है, और मैं लूप के लिए श्रेणी-आधारित के साथ शुरू होने वाली नई सुविधाओं को आजमाने की कोशिश करता हूं।
पहला लूप जिसे मैं बदलना चाहता था वह पॉइंटर्स के std :: वेक्टर पर पुनरावृत्त कर रहा था। मैंने कोड को नए सिंटैक्स का उपयोग करने के लिए बदल दिया, लेकिन यह संकलित नहीं हुआ।सी ++ 11 रेंज-पॉइंटर्स के वेक्टर पर आधारित

मैंने लूप के लिए एक और विकल्प बदलने की कोशिश की है, जो स्ट्रक्ड के वेक्टर के वेक्टर पर था, और यह संकलित और पूरी तरह से भाग गया।

यहाँ आप मेरी समस्या को दिखाने के लिए एक छोटी परीक्षण कोड है: जब मैं (छ ++ को पैरामीटर के रूप हाँ, मैं दे -std = C++ 0x) यह संकलित करने के लिए कोशिश

#include <vector> 
#include <iostream> 

int main() 
{ 
    std::vector<int> values; 

    values.push_back(2); 
    values.push_back(5); 
    values.push_back(8); 
    values.push_back(13); 
    values.push_back(17); 

    for (int &n : values) 
    { 
     std::cout << n << "\n"; 
    } 

    std::vector< int* > pointers; 

    pointers.push_back(new int(2)); 
    pointers.push_back(new int(5)); 
    pointers.push_back(new int(8)); 
    pointers.push_back(new int(13)); 
    pointers.push_back(new int(17)); 

    for ((int*) &p : values) 
    { 
     std::cout << (*p) << "\n"; 
    } 

    for(unsigned int i = 0; i < pointers.size(); ++i) 
    { 
     delete pointers[i]; 
    } 

    return 0; 
} 

, यह इस त्रुटि के साथ मर जाता है:
main.cpp|27|error: found ‘:’ in nested-name-specifier, expected ‘::’
यदि मैं 27-30 लाइनों पर लाइनों पर टिप्पणी करता हूं, तो यह ठीक है।

मैं क्या गलत कर रहा हूं? क्या संकेतक संदर्भ वाक्यविन्यास सही नहीं है?
या वहां निहित प्रकारों की एक सीमा है जहां लूप के लिए श्रेणी-आधारित उपयोग किया जा सकता है?

किसी भी मदद के लिए धन्यवाद!

+1

Proba चाहिए bly को SO –

+2

@Doug में ले जाया जा सकता है: सहमत ... और यह भी मदद करेगा यदि प्रश्न में एक छोटा यूआरएल होने के बजाय निश्चित रूप से स्रोत कोड शामिल था। – jprete

उत्तर

13
for ((int*) &p : values) 

यह गलत है। (int*) अकेले एक अभिव्यक्ति है, इसलिए आपको कम से कम सही बनाने के लिए int*& (कोई संश्लेषण नहीं है, जो एक अभिव्यक्ति - उर्फ ​​"प्रकार का नाम नहीं है) करने की आवश्यकता है। मैं व्यक्तिगत रूप से ऑटो या ऑटो & का उपयोग करना पसंद करता हूं।

आप कर सकते हैं:

for (auto p : values) // here p is a pointer, a copy of each pointer 

या

for (auto& p : values) // here p is a non-const reference to a pointer 

या

for (int* p : values) // here p is a copy of each pointer 

या जेनेरिक कोड में:

for (auto&& p: values) // p is either a const reference to what is in values, or a non-const reference, depends on the context 
+2

'के लिए (ऑटो * पी: मान) 'भी काम करता है। – Sjoerd

0

मुझे लगता है कि आप 'संकेत' के बजाय 'मूल्यों' वहां पर पुनरावृति करने के लिए होती ...

+0

बहुत बुरा है कि केवल एक ही जवाब स्वीकार किया जा सकता है। आप भी सही थे, मैं पॉइंटर्स के बजाय मूल्य लिखने के लिए मूर्ख था, लेकिन क्रीम की टिप्पणी अधिक विस्तृत थी, और कोष्ठक के साथ त्रुटि दिखाई दी। वैसे भी, बहुत बहुत धन्यवाद! – torokati44