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 是我的循环类

谢谢

4

4 回答 4

2

因为auto你似乎没有启用 c++11,如果你启用它,你应该删除这一行:

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

如果您在删除 auto 后无法使用 c++11 并且出现错误,则看起来您将此代码放入 const 方法中,因此将 iterator 替换为 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++)
于 2013-11-13T18:45:41.557 回答
1

据我所知,你在一个const方法中,你应该使用const_iterator或删除const.

如果auto您之前声明了变量,则不需要。它不会产生错误,只会产生警告,但您必须选择一种方式或另一种方式;)

于 2013-11-13T18:43:12.320 回答
1

要解决您的问题,请删除 auto关键字。

您必须启用 C++11 才能这样使用auto。如果您使用的是 gcc 编译器,您可以通过-std=c++11-std=c++0x编译器的开关来启用它。

目前它使用auto的是旧 C 编译器继承的关键字,这些关键字将被忽略。编译器认为您it再次声明但没有类型。

于 2013-11-13T18:44:11.003 回答
1

如果您确实启用了 C++11,那么您为什么要auto这样使用?只需使用基于范围的 for 循环:

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

此外,您的代码的问题是您指定了 的类型,因此在 for 循环it中使用没有意义。auto同样,如果你使用 C++11,你应该使用上面的循环,因为它更容易编写和理解。

于 2013-11-13T19:30:27.003 回答