在unordered_map中分配或插入类对象

时间:2018-03-07 15:55:08

标签: c++ class

我有一个类:class1,带有一个私有成员变量:

std::unordered_map<std::string, class2> s_list;

我正在尝试在上面class2中插入或分配s_list的对象。

class2有一个格式为

的复制构造函数
class2::class2(const class2& obj)
{
    x = obj.x;
    y = obj.y;
}

它还有另一个构造函数:

class2::class2(std::string x1, double y1)
{
    x = x1;
    y = y1;
}

class1的一个功能中,我有以下几行:

class2 s_obj(x1, y1);
s_list[x1] = s_obj;

但是,它会引发错误:

error: no matching function for call to ‘class2::class2()’
         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
                                                                      ^

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

您缺少默认ctor。在unordered_map中,如果key的值不匹配,则会创建默认值并返回对它的引用。

考虑下标运算符[]See Here。密切观察返回T&

如果您执行s_list["foo"]并且没有value与&#34; foo&#34;相关联它使用key&#34; foo&#34;在unordered_map中创建一个条目。并通过调用默认值ctor返回对默认值的引用。

在你的课堂2中,你没有一个。要修复它,请创建默认的ctor

class class2 // horrible name btw
{
   class2() = default;
}

或使用insertReference

答案 1 :(得分:2)

您可以在不需要构造函数的情况下将项添加到地图的另一种方法是使用函数insert而不是[]

s_list.insert({x1, s_obj})

这是因为(正如其他答案所述)[]返回对将要分配的对象的引用(因此必须创建);而insert会复制传递给它的对象,而不需要先创建它们。

从其他评论更新: 还存在insert_or_assign,如果存在,则将现有值分配给新值;即以与[]完全相同的方式工作,而不调用默认构造函数