将带有模板的自定义类插入std :: map

时间:2018-08-15 11:03:50

标签: c++ class templates stdmap

我已经编写了自己的课程,并且希望将其插入地图。请参见下面的示例:

#include <iostream>
#include <string>
#include <map>
#include <memory>
#include <mutex>

template <class T>
class A {
public:
    T a;
    A() = default;
    ~A() = default;
    A(T i) { a = i; }
};

int main()
{
  std::pair<int,A<int>> p;
  p = std::make_pair<int,A<int>>(9,A<int>(1));

  std::map<int, A<int>> m;
  m.emplace(1,A<int>(1));
}

当我尝试对此进行编译时,我遇到了一个巨大的错误。请帮助解释。 :)

在这里看到错误: http://cpp.sh/9nc35

编辑: 我有错字,谢谢!但是,我最初遇到的另一个问题现在出现了。好像是因为互斥锁?为什么?

2 个答案:

答案 0 :(得分:1)

您的地图定义为:

std::map<int, std::unique_ptr<A<int>>>

但是在下一行中,您尝试将std::pair<int, A<int>>传递给m.emplace()作为密钥。

我想你只是想做:

m.emplace(9, std::make_unique<A<int>>(1));
//        ^
//        Not `p`

答案 1 :(得分:0)

您正在尝试将对(对<...>,A)插入/放置对(同时已将其键指定为int)。您最可能希望使用m.emplace(9,std::make_unique<A<int>>(1));(而不是9参见p)或只是m.insert(p);(在cpp.sh中可以正常工作)。

此外,您在此处使用unique_ptr很可能是错误的/不必要的,只会使事情复杂化。请参见此处的固定示例:http://cpp.sh/3d2hw

此外,您可以研究STL集合/在https://en.cppreference.com上查看一些基本示例(对于某些地图构造示例,请参见https://en.cppreference.com/w/cpp/container/map/map)。