如何在key为std::shared_ptr的std::map中查找元素?编译失败如何解决?
问题原因
- 核心错误:
std::map的迭代器解引用后得到的是std::pair<const 键类型, 值类型>类型的对象,而非你预期的单独的键对象。你传给std::find_if的lambda接收的参数是std::shared_ptr<MyObjB> const&,和迭代器实际传入的pair类型不匹配,所以编译失败。 - 其他潜在问题:
- 代码里的
net::MyObjB objB;是默认构造的对象,没有使用你函数传入的参数t,逻辑上大概率不符合你的查找需求 - 外层定义的
typename std::map<std::shared_ptr<T>, std::shared_ptr<ValObj>>::iterator it;完全未使用,属于冗余代码 - 要确保
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
相关产品推荐
相关产品推荐

