矢量迭代器不兼容..但是为什么

Vector iterators incompatible... but why?

本文关键字:为什么 不兼容 迭代器      更新时间:2023-10-16

我收到消息"向量迭代器不兼容"。我试图绕开它,但什么都没有。我以前做过。相同的代码,只是未在接收"cWORLD* World"的类中使用。我做错了什么?

谢谢!

    else if (Click[2] == true)
        {
            //go through objects and check collision
            for (vector<cOBJECT*>::iterator it = World->ReturnWorldObjects().begin(); it != World->ReturnWorldObjects().end();)
            {
                //Check for collision and delete object
                if (PointInRect(MouseX + offX, MouseY + offY, (*it)->getrect()) == true)
                {
                    // delete object, delete slot, pick up next slot
                    delete *it;
                    it = World->ReturnWorldObjects().erase(it);
                }
                else
                {    // no action, move to next
                    ++it;
                }
            }//for
        }//else if (Click[2] == true)

看起来ReturnWorldObjects返回向量的副本,而不是引用。在这种情况下,您正在尝试比较不同对象的迭代器,这些迭代器不是通过标准检查的,但可以通过检查的迭代器进行检查(在这种情况下,我认为是MSVC检查的迭代器)。

就像@ForEveR已经提到的,你可能会在函数 ReturnWorldObjects() 中返回向量的副本。如果没有看到此方法的声明,我只能假设它类似于vector<cOBJECT*> ReturnWorldObject();

我认为,您可以通过 2 种解决方案来解决这个问题:

1. 返回对世界类中矢量的引用

const vector<cOBJECT*>& ReturnWorldObjects()
{
   return m_vecWorldObjects; // Your vector here
}

2. 获取该函数的一个副本并在代码中使用它

...
vector<cOBJECT*> worldObjects = World->ReturnWorldObjects();
for (vector<cOBJECT*>::iterator it = worldObjects.begin(); it != worldObjects.end(); it++)
{
   ...
}
...