2013-04-19 9 views
7

क्यूटी का उपयोग करते हुए की सूची पर काम नहीं कर रहा है, मैं इस कोड काम करना चाहता हूँ:foreach QPair

QList<QPair<QString, QString>> list; 
foreach (QPair<QString, QString> pair, list) 
{ 
} 
बजाय

, मैं त्रुटि मिलती है: 'जोड़ी': अघोषित पहचानकर्ता

एक typedef मैं का उपयोग करना यह काम कर सकते हैं, लेकिन यह नहीं है जो मैं चाहता (जब तक यह केवल एक चीज है कि काम करता है):

typedef QPair<QString, QString> MyPair; 
QList<MyPair> list; 
foreach (MyPair pair, list) 
{ 
} 

किसी को भी क्यों पहले foreach कर व्याख्या कर सकते हैं संकलन नहीं करते?

+2

और आप क्या चाहते हैं? शायद आपको foreach (MyPair ** और ** जोड़ी, सूची) की आवश्यकता है {} बीटीडब्ल्यू। foreach - मैक्रोज़ है, तो अंदर अल्पविराम का उपयोग स्वीकार्य नहीं है। typedef - केवल समाधान है। –

+0

@DmitrySazonov: मैं किसी अन्य मामले की तरह 'foreach' का उपयोग करना चाहता हूं: f.e. 'QList सूची; foreach (QString str, सूची) {} ' –

+0

मेरी ऊपरी संपादित पोस्ट देखें;) –

उत्तर

10

यह क्यूटी अंदर टेम्पलेट वर्गों का उपयोग करने के लिए संभव नहीं है foreach कथन जिसमें एक से अधिक टेम्पलेट पैरामीटर शामिल हैं, क्योंकि अल्पविराम विभाजक मैक्रोज़ के अंदर अल्पविराम विभाजक के साथ संघर्ष करता है।

#define add(a, b) (a + b) 

template < typename T1, typename T2 > 
struct DATA 
{ 
    static const T1 val1 = 1; 
    static const T2 val2 = 2; 
}; 

// Usage 
const int c = add(1, 2); // OK 
const int d = add(DATA< int, int >::val1 , DATA< int, int >::val2); // FAIL 

क्योंकि मैक्रो व्याख्या करेगा पहला तर्क के रूप में "डेटा < पूर्णांक", और के रूप में दूसरा "पूर्णांक> :: VAL1", और इतने पर जोड़ें।

+2

क्यूपेयर <क्यूस्ट्रिंग, क्यूस्ट्रिंग> जोड़ी; foreach (जोड़ी, tmplist) mainlist.append (जोड़ी); – Shf

+0

हाँ, पहले ही प्रदान किया गया है - http://stackoverflow.com/questions/16104192/foreach-not-working-on-list-of-qpair/16104594?noredirect=1#comment22996614_16104192 –

8

यह foreach त्रुटि नहीं है। यह घोषणा त्रुटि है।

QList<QPair<QString, QString>> list; 

जबकि यह इस तरह से होना चाहिए::

QList<QPair<QString, QString> > list; 

बस QPair लूप के बाहर की घोषणा: आप इस तरह की सूची घोषित

QPair<QString,QString> pair; 
foreach(pair,list){ 

} 
+1

यह कुछ उपयोगकेस के लिए अंतर बनाता है जब >> टेम्पलेट ब्रैकेट के बजाय ऑपरेटर >> ओवरलोडिंग की तरह व्याख्या की जा सकती है। –

+0

हो सकता है, लेकिन त्रुटि एक ही है ... –

+0

अन्य तरीकों से '>>' '' 'ऑपरेटर – Shf

0

ऊपर जवाब के साथ कुछ स्पष्टीकरण ... यदि आपके संकलक

QList<QPair<QString, QString>> list; 
ऐसी घोषणा पर कोई त्रुटि है

स्वीकार करते हैं, विषय ढलाईकार त्रुटि के लिए कारणों अलग है और वास्तव में एक तथ्य यह है कि घोषणा किया जाना चाहिए के साथ क्या करना है foreach() लूप के बाहर। यह क्यूटी दस्तावेज में समझाया गया है।

>> और>> ... के बारे में पुरानी कहानी और नवीनतम जीसीसी (इसलिए लिनक्स/मैक) इसे सिंटैक्स गलती मानते हैं, क्योंकि यह मानक अनुरूप नहीं है। >> जीसीसी तरीके में सभी अनुवर्ती त्रुटियों के साथ ऑपरेटर के रूप में माना जाता है ..