2013-04-19 30 views
7

Sử dụng Qt, tôi muốn mã này để làm việc:foreach không làm việc trên danh sách các QPair

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

thay vào đó, tôi nhận được thông báo lỗi: 'cặp': không khai báo định danh

Sử dụng một typedef tôi có thể làm cho nó hoạt động, nhưng đây không phải là những gì tôi muốn (trừ khi đây là điều duy nhất mà hoạt động):

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

bất cứ ai có thể giải thích lý do tại sao foreach đầu tiên làm không biên dịch?

+2

Và bạn muốn gì? Có thể bạn cần foreach (cặp MyPair ** & **), danh sách) {} Btw. foreach - là macro, do đó việc sử dụng dấu phẩy bên trong không được chấp nhận. typedef - là giải pháp duy nhất. –

+0

@DmitrySazonov: Tôi muốn sử dụng 'foreach' như trong bất kỳ trường hợp nào khác: f.e. Danh sách 'QList '; foreach (QString str, list) {} ' –

+0

Xem bài viết đã chỉnh sửa của tôi;) –

Trả lời

10

Nó không phải là có thể sử dụng các lớp học mẫu bên qt báo cáo foreach chứa nhiều tham số mẫu, vì dấu phân cách bằng dấu phẩy xung đột với dấu phân cách bằng dấu phẩy bên trong macro.

#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 

vì macro thêm sẽ giải thích "DỮ LIỆU < int" như là đối số đầu tiên, và "int> :: VAL1" như thứ hai, và vân vân.

+2

cặp QPair ; foreach (cặp, tmplist) mainlist.append (pair); – Shf

+0

Đúng, đã được cung cấp - http://stackoverflow.com/questions/16104192/foreach-not-working-on-list-of-qpair/16104594?noredirect=1#comment22996614_16104192 –

8

nó không phải là lỗi foreach. Đó là lỗi khai báo. Bạn tuyên bố danh sách như thế này:

QList<QPair<QString, QString>> list; 

trong khi nó nên theo cách này:

QList<QPair<QString, QString> > list; 

Chỉ cần tuyên bố QPair bên ngoài vòng lặp:

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

} 
+1

Nó tạo sự khác biệt đối với một số lần sử dụng khi >> có thể được hiểu là toán tử >> quá tải thay vì dấu ngoặc đơn. –

+0

Có thể, nhưng lỗi là giống nhau ... –

+0

cách khác '>>' sẽ được coi là toán tử '>>' – Shf

0

Một số giải thích với câu trả lời ở trên ... nếu trình biên dịch của bạn chấp nhận

QList<QPair<QString, QString>> list; 

cho không có lỗi về tuyên bố như vậy, lý do lỗi chủ đề caster là khác nhau và thực sự đã làm với một thực tế là khai phải được thực hiện bên ngoài vòng lặp foreach(). Điều đó được giải thích trong tài liệu QT.

liên quan đến >> và>> ... đó là câu chuyện cũ và GCC mới nhất (vì vậy Linux/mac) coi đó là lỗi cú pháp, vì nó không phù hợp với tiêu chuẩn. >> theo cách GCC được coi là nhà điều hành với tất cả các lỗi theo dõi ..

Các vấn đề liên quan