C ++嵌套映射没有匹配的成员函数const成员

时间:2016-10-01 21:28:54

标签: c++ stl stdmap

我有一个嵌套的地图,比如

map = {
  key : {
    innerKey: innerVal
  }
}

我尝试从标记为innerVal的成员函数中搜索const。我正在使用此处所述的at() C++ map access discards qualifiers (const) 这让我得到key指向的地图。但是,当我尝试在嵌套地图上使用at()时,我收到错误:

error: no matching member function for call to 'at'

解决方法:我可以使用迭代器并在嵌套映射上进行线性搜索,这非常有效。如何使用at()find()等功能搜索嵌套地图。

TLDR:

private std::map<int, std::map<int, int> > privateStore;

int search(int key1, int key2) const {
  return privateStore.at(key1).at(key2); //works when I remove `const` from function signature

}

修改:它适用于以上简化代码try this,并尝试从第20行删除const关键字。

#include <iostream>
#include <map>
#include <thread>

template <typename T>
class Foo
{
public:
  Foo()
  {
    std::cout << "init";
  }

  void set(T val)
  {
    privateStore[std::this_thread::get_id()][this] = val;
  }

  T search(std::thread::id key1) const
  {
    std::map<Foo<T>*, T>  retVal = privateStore.at(key1); //works when I remove `const` from function signature
    return retVal.at(this);
  }

private:
  static std::map<std::thread::id, std::map<Foo<T>*, T> > privateStore;
};

template<typename T> std::map<std::thread::id, std::map<Foo<T>*, T> > Foo<T>::privateStore = {};

int main()
{
  Foo<int> a;
  a.set(12);
  std::cout << a.search(std::this_thread::get_id());
}

1 个答案:

答案 0 :(得分:1)

声明内部地图的键是指向const对象的指针。否则,当你在const函数中传递this时,你会传递Foo<T> const*而不是Foo<T>*而你无法隐式转换它。

所以

static std::map<std::thread::id, std::map<Foo<T> *, T> > privateStore;

static std::map<std::thread::id, std::map<Foo<T> const*, T> > privateStore;

在定义中也一样。

您的示例的

live example - 已修复。