C++从vector删除shared_ptr时出现==运算符不匹配MSVC编译错误
问题原因
std::erase用法错误:C++标准库的自由函数std::erase针对std::vector的重载,第二个参数是要删除的元素值,不是迭代器。你给它传入了迭代器,它内部会遍历vector中所有shared_ptr<Contact>元素,尝试和你传入的迭代器做==比较,二者类型完全不匹配,就触发了你看到的运算符不兼容报错。- 迭代器偏移计算错误:
findContact返回的是从0开始的正向索引,直接用contacts.begin() + index就能得到对应元素的迭代器,你写的contacts.size() - index算出来的是反向偏移,会指到错误位置甚至出现越界问题。
修复方案
直接修改removeContact(const size_t index)的实现即可,推荐选择第一种改法,更符合按索引删除的预期:
改法1:使用vector的成员函数erase
void Database::removeContact(const size_t index) { // 可选添加边界校验,逻辑更健壮 if (index >= contacts.size()) { throw ContactNotFoundException(); } contacts.erase(contacts.begin() + index); }
改法2:保留自由函数std::erase的写法,传入要删除的元素值
注意:如果你的通讯录存在重复的联系人指针,该方法会删除所有匹配的元素,和按索引删除的逻辑有差异。
void Database::removeContact(const size_t index) { if (index >= contacts.size()) { throw ContactNotFoundException(); } std::erase(contacts, contacts.at(index)); }
内容的提问来源于stack exchange,提问作者Thomas Herondale
相关产品推荐
相关产品推荐

