2009-06-05 28 views
6

aşağıdaki üye veriC++ yineleyici problemleri

vector<State<T>*> activeChildren; 

temizlemem-up bu işaretçileri benim yıkıcı istiyorum var

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

Ben Ubuntu'da g ++ 4.3.2 aşağıdaki hatayı alıyorum:

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

Herkes yanlış yaptığımı söyleyebilir mi? Ben yineleyici döngüler kullanan iki daha çok yerde bu hatayı alıyorum ama for_each (...)

+0

Boost :: ptr_vector > –

cevap

20

tekrar typename zaman gibi görünüyor kullandığınızda değil - Sana ihtiyacım var:

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

bir sezgisel için g ++ kullanıcıları - şablon kodunda bu mesajı gördüğünüzde:

expected `;' before ‘it’ 

o bu çok türü olarak derleyici tarafından görülen ve varlık değildir önünde şey ihtiyaç duyduğu oldukça iyi bir bahis ' typename 'eklendi.

+0

Kullanmak için iyi bir yer gibi görünüyor Anketi yanıtladığım son kez tanıştık * ding * * ding * typename! ;) – bobbyalex

+0

Ben sormadan önce bu gibi hataları bulmaya çalıştım, ama g ++ tam olarak iyi hata vermez. Asla C++ öğrenemedim, sadece yol boyunca aldığım şeyi kullanıyorum. – KitsuneYMG

+0

Kts: Arama yaparak bir cevap bulmanız beklenebileceğini düşünmüyorum - oldukça makul bir arama sorgusu bulmak için cevabı bilmek zorundasınız. –

5

Bu bir ayrıştırma sorunudur. Bu kodda, vector<State<T>*>::iterator iç içe bağımlı bir türüdür.

T'nin (ve ayrıştırılma zamanında T'nin bilinmediğini) bilmediğiniz sürece, çözümleyici/derleyici yineleyicinin bir tür olduğunu fark etmez (tüm bildiği için statik üye değişkeni olabilir).

Bu nedenle, tanımlayıcıya, tüm vector<State<T>*>, vector<State<T>*>::iterator için bir tür adı olduğunu bildiren bir ipucu olarak türüyle bir önek eklemelisiniz.