向量迭代器不兼容...但是为啥呢?

Posted

技术标签:

【中文标题】向量迭代器不兼容...但是为啥呢?【英文标题】:Vector iterators incompatible... but why?向量迭代器不兼容...但是为什么呢? 【发布时间】:2015-02-03 11:11:53 【问题描述】:

我收到消息“向量迭代器不兼容”。我试着把头绕过去,但什么也没有。我以前做过。相同的代码,只是没有在接收“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() 返回的任何内容的类型很重要,那么您是对的。缩小范围并发布MCVE。 【参考方案1】:

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

【讨论】:

谢谢!你是对的,我将不得不检查如何不退回副本。【参考方案2】:

就像@ForEveR 已经提到的那样,您可能会在函数ReturnWorldObjects() 中返回一个向量的副本。没有看到这个方法的声明,我只能假设它类似于vector&lt;cOBJECT*&gt; ReturnWorldObject();

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

1.返回对 World Class 中向量的引用

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++)

   ...

...

【讨论】:

以上是关于向量迭代器不兼容...但是为啥呢?的主要内容,如果未能解决你的问题,请参考以下文章

opencv“向量迭代器不兼容”

在自包含向量循环中删除时“向量迭代器不兼容”

C++ for-each 语句触发“向量迭代器不兼容”断言失败:this->_Getcont() == 0

字符串迭代器不兼容 boost::tokenizer

向量迭代器在赋值重载中不兼容

向量的C++参考