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

如何在key为std::shared_ptr的std::map中查找元素?编译失败如何解决?

问题原因

  • 核心错误:std::map 的迭代器解引用后得到的是 std::pair<const 键类型, 值类型> 类型的对象,而非你预期的单独的键对象。你传给 std::find_if 的lambda接收的参数是 std::shared_ptr<MyObjB> const&,和迭代器实际传入的pair类型不匹配,所以编译失败。
  • 其他潜在问题:
    1. 代码里的 net::MyObjB objB; 是默认构造的对象,没有使用你函数传入的参数 t,逻辑上大概率不符合你的查找需求
    2. 外层定义的 typename std::map<std::shared_ptr<T>, std::shared_ptr<ValObj>>::iterator it; 完全未使用,属于冗余代码
    3. 要确保 MyObjB 类已经重载了 operator== 运算符,否则 *p == objB 也会编译失败

解决方法

把lambda的参数改成匹配map迭代器的pair类型,取pair的first成员(也就是键的shared_ptr)做比较即可,同时可以补充MyObjA对应的查找分支,完整修正代码如下:

std::map<std::shared_ptr<MyObjA>, std::shared_ptr<ValObj>> aobjs;
std::map<std::shared_ptr<MyObjB>, std::shared_ptr<ValObj>> bobjs;

template <typename T>
int findit(T& t)
{
    if constexpr(std::is_same<T, net::MyObjB>::value) {
        // 直接用传入的参数作为比较基准,替代原来的默认构造objB
        const auto& objB = t;
        auto it = std::find_if(bobjs.begin(), bobjs.end(), 
                [&](const auto& item) {
            // item是map的pair元素,first是键的shared_ptr<MyObjB>
            return *item.first == objB;
        });

        if (it != bobjs.end()) {
            // 查找到元素,it->second就是对应的ValObj的shared_ptr
            return 0;
        }
    }
    // 补充MyObjA对应的查找逻辑
    else if constexpr(std::is_same<T, net::MyObjA>::value) {
        const auto& objA = t;
        auto it = std::find_if(aobjs.begin(), aobjs.end(), 
                [&](const auto& item) {
            return *item.first == objA;
        });
        if (it != aobjs.end()) {
            return 0;
        }
    }
    
    return -1;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:54:07