我有一个像这样声明的类:
class Level
{
private:
std::vector<mapObject::MapObject> features;
(...)
};
在其中一个成员函数中,我尝试迭代遍历该向量:
vector<mapObject::MapObject::iterator it;
for(it=features.begin(); it<features.end(); it++)
{
/* loop code */
}
这对我来说似乎很简单,但是g ++给了我这个错误:
src/Level.cpp:402: error: no match for ‘operator=’ in ‘it = ((const yarl::level::Level*)this)->yarl::level::Level::features.std::vector<_Tp, _Alloc>::begin [with _Tp = yarl::mapObject::MapObject, _Alloc =
std::allocator<yarl::mapObject::MapObject>]()’
/usr/include/c++/4.4/bits/stl_iterator.h:669: note: candidates are: __gnu_cxx::__normal_iterator<yarl::mapObject::MapObject*,
std::vector > >& __gnu_cxx::__normal_iterator<yarl::mapObject::MapObject*,
std::vector > >::operator=(const __gnu_cxx::__normal_iterator<yarl::mapObject::MapObject*, ``std::vector<yarl::mapObject::MapObject, std::allocator<yarl::mapObject::MapObject> > >&)
任何人都知道为什么会这样吗?
答案 0 :(得分:15)
我猜这部分错误描述了你的问题:
(const yarl::level::Level*)this
成员函数中是否找到了此代码的const限定成员函数?如果是这样,您需要使用const_iterator
:
vector<mapObject::MapObject>::const_iterator it;
如果成员函数是const限定的,那么只有成员向量上的begin()
和end()
的const限定重载才可用,并且这两个都返回const_iterator
个
答案 1 :(得分:2)
你在这里关闭了直角支架吗?
vector<mapObject::MapObject::iterator it;
如果你想要一个对象矢量,你的对象需要一个operator =。 MapObject有一个吗?如果没有,请考虑一个指向MapObject的指针向量。
答案 2 :(得分:0)
如果我是你,我会检查mapObject :: MapObject是否有默认构造函数和公共赋值运算符。
在类标题的某处,您应该看到类似的内容:
public:
MapObject();
operator=(const MapObject &mapObject);
这意味着该类具有默认构造函数和赋值运算符。
无法使用没有默认构造函数的类来实例化std :: vector,并且如果没有赋值运算符,则无法如上所述迭代该类。
因此,在类定义中添加赋值运算符,迭代将编译。
答案 3 :(得分:0)
@James McNellis的回答(“绿色检查”最佳答案)用类似的描述修复了我的错误,但是我的错误是由@tmarthal提到他的回答帖子(没有定义赋值运算符)引起的。他建议的修复是包含一个赋值运算符,但我只是想补充一点,我也能通过使用std :: vector&lt;&gt; :: const_iterator而不是std :: vector&lt;&gt; :: iterator来修复这个错误。没有定义赋值运算符。我不确定这是否真的是一个正确的解决方案,或者只是阻止编译器抱怨的东西。