我有这段代码:
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是我的循环类
由于
答案 0 :(得分:2)
对于auto
,您似乎没有启用c ++ 11,如果启用它,则应删除此行:
std::vector<A>::iterator it;
如果您在删除auto后无法使用c ++ 11和错误,看起来就像将此代码放入const方法一样,所以用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 :(得分:1)
从我看到的情况来看,您使用const
方法,应使用const_iterator
,或删除const
。
如果您之前声明了变量,则不需要auto
。它不会产生错误,只是一个警告,但你必须选择一种方式;)
答案 2 :(得分:1)
解决您的问题删除 auto
关键字。
您必须启用C ++ 11才能使用auto
。如果您使用的是gcc编译器,则可以通过-std=c++11
或-std=c++0x
编译器的开关来启用它。
目前它正在使用旧版C编译器继承的auto
关键字,这些关键字将被省略。编译器认为你再次声明it
但没有类型。
答案 3 :(得分:1)
如果您确实启用了C ++ 11,那么为什么要像这样使用auto
?只需使用基于范围的for循环:
for (auto i : m_vA)
// do stuff here with i
此外,您的代码的问题是您指定了it
的类型,因此在for循环中使用auto
毫无意义。同样,如果你正在使用C ++ 11,你应该使用上面的循环,因为它更容易编写和理解。