2013-11-13 2 views
1

У меня есть этот код:цикла в векторе с ++ с использованием итератора

std::vector<A>::iterator it; 
for(auto it = m_vA.begin(); it != m_vA.end(); it++) 

и я угольник ошибки:

ISO C++ forbids declaration of 'it' with no type 
cannot convert '__gnu_cxx::__normal_iterator<A* const*, std::vector<tp::Vehicule*, std::allocator<A*> > >' to 'int' in initialization 

и если я удалю авто

erreur: no match for 'operator=' in 'it = ((const B*)this)->B::m_vA.std::vector<_Tp, _Alloc>::begin [with _Tp = A*, _Alloc = std::allocator<A*>]()' 

B является класс с моей петлей

Thanks

+0

Какой компилятор вы используете? Каковы флаги компиляции, если вы используете gcc? – Raxvan

+0

Похож, что 'm_VA' является' const' в этом контексте, поэтому для этого требуется 'std :: vector :: const_iterator it;'. Чтобы использовать 'auto', вам нужно включить функции' C++ 11', передав '-std = C++ 11' вашему компилятору. – Chad

+0

Исходя из вашей ошибки, 'm_vA' имеет тип' std :: vector ', это правильно? –

ответ

2

Для auto вы, кажется, не имеет с ++ 11 включена, если вы включите его, вы должны удалить эту строку:

std::vector<A>::iterator it; 

Если вы не можете использовать C++ 11 и ошибки после снятия авто , выглядит, как вы поместите этот код в сопзЬ метод, поэтому заменить итератор с const_iterator:

std::vector<A>::const_iterator it; 
for(it = m_vA.begin(); it != m_vA.end(); it++) 

вы также можете сделать это одна линия, если вам не нужен этот итератор после цикла:

for(std::vector<A>::const_iterator it = m_vA.begin(); it != m_vA.end(); it++) 
1

Из того, что я вижу, вы находитесь в методе const, вы должны использовать const_iterator или удалить const.

И auto не требуется, если вы объявляете свою переменную раньше. Это не приведет к ошибке, только предупреждение, но вы должны выбрать одну или другую;)

1

Чтобы решить вашу проблему удалитьauto ключевое слово.

У вас должен быть включен C++ 11 auto. Если вы используете gcc-компилятор, вы можете включить его с помощью переключателя компилятора -std=c++11 или -std=c++0x.

В настоящее время используется ключевое слово auto, унаследованное старыми компиляторами C, которые просто будут опускаться. Компилятор считает, что вы снова объявляете it, но без типа.

1

Если у вас включен C++ 11, то почему вы используете auto вот так? Просто используйте диапазон на основе цикла:

for (auto i : m_vA) 
    // do stuff here with i 

Кроме того, проблема с вашим кодом является то, что вы указали тип it, так что нет никакого смысла в использовании auto в течение цикла. Опять же, если вы используете C++ 11, вы должны использовать описанный выше цикл, потому что его гораздо легче писать и понимать.

Смежные вопросы