You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:27:04