【问题标题】:Insert custom class with template into std::map将带有模板的自定义类插入 std::map
【发布时间】:2018-08-15 11:03:49
【问题描述】:

我已经编写了自己的类,我想将它插入到地图中。请看下面的例子:

#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

编辑: 我有错字,谢谢!不过,我首先遇到的另一个问题现在出现了。似乎是因为互斥锁?为什么?

【问题讨论】:

  • 我通常会全力以赴将错误消息作为文本发布在帖子中,但是是的......在这种情况下......我不知道......它真的很长而且它是甚至不清楚它的哪一部分是重要的。等不及概念在标准库中实现并摆脱这些不可读的模板错误。
  • 链接的程序没有给出任何编译错误。被修改了吗?同样,请不要以使其不再是问题或使现有答案不正确或不适用的方式“修复”问题中的代码。如果您随后遇到不同的问题并需要帮助,您可以针对该问题创建另一个问题。
  • 我仍然有问题,它无法编译。我看到我必须在“获取 url”之前尝试运行它...
  • 所以现在你的问题主要是讨论一个不再存在的问题(并且没有在你的代码中展示),但是你有一个新的和不同的问题,你根本没有描述过。这不是使用问答网站的好方法,因为问题和答案不再有用相关。只需提出一个新问题描述您的实际问题并显示任何错误

标签: c++ class templates stdmap


【解决方案1】:

您的地图定义为:

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

但在下一行中,您尝试将 std::pair&lt;int, A&lt;int&gt;&gt; 作为密钥传递给 m.emplace()

我想你只是想做:

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

【讨论】:

    【解决方案2】:

    您正在尝试将 (pair<...>, A) 插入/放置对 (pair<...>, A) 到您的地图中,而您已将它的键指定为 int。您很可能想要m.emplace(9,std::make_unique&lt;A&lt;int&gt;&gt;(1));(请参阅9 而不是p)或只是m.insert(p);(在您的cpp.sh 中可以正常工作)。

    此外,您在此处使用unique_ptr 很可能是错误的/没有根据的,只会使事情复杂化。在此处查看固定示例:http://cpp.sh/3d2hw

    此外,您可以在https://en.cppreference.com 上学习 STL 集合/查看一些基本示例(https://en.cppreference.com/w/cpp/container/map/map 了解一些地图构建示例)。

    【讨论】:

    • 仅供参考,m.insert(p) 也不起作用,因为 value_type 期待的是 std::unique_ptr&lt;A&lt;int&gt;&gt;,而不是 A&lt;int&gt; 的简单实例。
    • @KarlNicoll 我指的是链接代码,因为@pointerdk 在他的 SO 问题中只添加了unique_ptr(看起来很沮丧,因为它的应用不一致)。
    • 啊,我明白了!是的,看看 cpp.sh 链接,m.insert(p) 解决方案会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多