2009-06-05 40 views
6

Tôi có dữ liệu thành viên sauC++ vấn đề iterator

vector<State<T>*> activeChildren; 

Tôi muốn để làm sạch-up những gợi ý trong destructor của tôi

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

tôi nhận được lỗi sau từ g ++ 4.3.2 trên Ubuntu:

./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 

Bất cứ ai có thể cho tôi biết tôi đã làm gì sai? Tôi nhận được lỗi này ở hai nơi nhiều nơi tôi sử dụng vòng lặp, nhưng không phải khi tôi sử dụng for_each (...)

+0

Có vẻ như một nơi tốt để sử dụng boost :: ptr_vector > –

Trả lời

20

Hình như typename thời gian một lần nữa - Tôi nghĩ rằng bạn cần:

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

Một heuristic cho g ++ sử dụng - khi bạn thấy thông báo này trong mẫu mã:

expected `;' before ‘it’ 

nó là một cược khá tốt mà điều ở phía trước của 'nó' không được nhìn thấy bởi trình biên dịch như một loại và do đó cần có một ' typename 'được thêm vào.

+0

Chúng tôi đã gặp lần cuối cùng về câu hỏi của mình mà câu trả lời là * ding * * ding * typename! ;) – bobbyalex

+0

Vâng, tôi đã cố gắng để tìm lỗi như thế này trước khi tôi hỏi, nhưng g + + không chính xác cung cấp cho các lỗi tốt. Tôi chưa bao giờ thực sự học C++, tôi chỉ sử dụng những gì tôi đã chọn trên đường đi. – KitsuneYMG

+0

@ kts: Tôi không nghĩ rằng bạn có thể được mong đợi tìm câu trả lời bằng cách tìm kiếm - bạn sẽ phải biết câu trả lời để tìm ra một truy vấn tìm kiếm hợp lý. –

5

Đó là sự cố phân tích cú pháp. Trong mã này, vector<State<T>*>::iterator là loại phụ thuộc lồng nhau. Cho đến khi bạn biết T là gì (và T không biết tại thời gian phân tích cú pháp), trình phân tích cú pháp/trình biên dịch không nhận ra rằng trình vòng lặp là một kiểu (có thể là một biến thành viên tĩnh, cho tất cả nó biết).

Vì vậy, bạn phải đặt tiền tố định nghĩa với tên tệp làm gợi ý để báo cho trình biên dịch biết rằng tất cả vector<State<T>*>, vector<State<T>*>::iterator là tên kiểu.