You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

C++中Vector使用出现error C2664异常报错求助

解决std::vector::erase()的C2664类型转换错误

嘿,这个问题我太熟悉了!你碰到的error C2664本质是类型不匹配——std::vector::erase()方法要求传入的参数是它的迭代器类型,而你传进去的是一个指向vector元素的指针,这俩完全不是一回事,编译器当然会报错。

问题出在哪?

看你代码里的这一行:

open.erase(&open[bestPlace]); // Take the best node out of the Open list

open[bestPlace]返回的是vector里存储的MAPTILE*对象,取地址后得到的是MAPTILE**类型;但std::vector::erase()需要的是std::_Vector_const_iterator<_Ty,_Alloc>(也就是std::vector<MAPTILE*>::const_iterator)类型的迭代器,这俩类型无法隐式转换,所以触发了C2664错误。

怎么修复?

最直接的修改是用索引生成迭代器——因为std::vector的迭代器是随机访问迭代器,支持通过begin()加上索引的方式获取对应位置的迭代器。把出错的那行代码改成:

open.erase(open.begin() + bestPlace);

这样就给erase()传了正确的迭代器类型,VC2008完全能识别这个写法(符合C++03标准,正是VC2008遵循的版本)。

额外小提示

顺便说一句,你代码里的if(best == NULL)break;其实没必要保留:因为while循环的条件已经保证了open非空,best是从open[0]取的,不可能是NULL,这个判断可以删掉,避免多余的逻辑。

内容的提问来源于stack exchange,提问作者rjhwinner03

火山引擎 最新活动