C++ 在无序映射中指定或插入类对象

C++ 在无序映射中指定或插入类对象,c++,class,C++,Class,我有一个类:class1,带有一个私有成员变量: std::无序的地图列表 我正在尝试在上面的s_列表中插入或分配class2的对象 class2具有以下表单的副本构造函数: class2::class2(const class2& obj) { x = obj.x; y = obj.y; } 它还有另一个构造函数: class2::class2(std::string x1, double y1) { x = x1; y = y1; } 在class

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

std::无序的地图列表

我正在尝试在上面的
s_列表中插入或分配
class2
的对象

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))...)
                                                                      ^
错误:调用'class2::class2()'时没有匹配的函数
第二个(std::forward(std::get(_tuple2))…)
^

我这里缺少什么?

您缺少一个默认的
ctor
。在
无序映射中
如果
键的值不匹配
它将创建一个默认值并返回对该值的引用

考虑下标运算符
[]
。。仔细观察返回的
T&

如果执行
s_list[“foo”]
操作,并且没有与“foo”关联的
,它将在无序的_映射中使用
“foo”创建一个条目,并通过调用默认值返回对默认值的引用

在你的班上,你没有一个。要修复它,请创建一个默认的ctor

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

或者使用
insert

您缺少一个默认的
ctor
。在
无序映射中
如果
键的值不匹配
它将创建一个默认值并返回对该值的引用

考虑下标运算符
[]
。。仔细观察返回的
T&

如果执行
s_list[“foo”]
操作,并且没有与“foo”关联的
,它将在无序的_映射中使用
“foo”创建一个条目,并通过调用默认值返回对默认值的引用

在你的班上,你没有一个。要修复它,请创建一个默认的ctor

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

或者使用
insert

在不需要构造函数的情况下向地图添加项目的另一种方法是使用函数
insert
,而不是
[]

ie
s_列表。插入({x1,s_obj})

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

其他评论的更新:
还存在
insert\u或\u assign
,如果存在,则将现有值分配给新值;ie的工作方式与
[]
完全相同,无需调用默认构造函数

另一种方法是使用函数
insert
而不是
[]
将项目添加到地图中,而无需该构造函数

ie
s_列表。插入({x1,s_obj})

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

其他评论的更新:
还存在
insert\u或\u assign
,如果存在,则将现有值分配给新值;ie的工作方式与
[]
完全相同,无需调用默认构造函数

,正如错误消息所述,您需要一个默认构造函数
class2::class2()
。由于用户提供了一个ctor,因此不会生成默认ctor。您需要class2的默认ctor,即class2::class2(){},如
s_list[x1]
的文档中所述,使用默认构造函数插入元素。你们班没有,所以不能这么做。您是否尝试改用了?正如错误消息所说,您需要一个默认构造函数
class2::class2()
。由于用户提供了一个ctor,因此不会生成默认ctor。您需要class2的默认ctor,即class2::class2(){},如
s_list[x1]
的文档中所述,使用默认构造函数插入元素。你们班没有,所以不能这么做。你试过使用它吗?你建议如何解决这个问题?但是复制构造函数不应该在没有默认构造函数的情况下处理它吗?@skr_robo不,不是真的。在元素创建之后,值被复制。@skr\u robo阿尔伽达斯所说的值被复制之后。创建一个默认的ctor,可能对值执行getter/setter,或者在创建对象后,通过为其分配一个新对象来使用复制ctor。我也会考虑存储指针而不是原始对象。@ SkryRoo如果它在一个循环中;那么,更好的调用函数是您建议如何解决这个问题?但是复制构造函数不应该在没有默认构造函数的情况下处理它吗?@skr\u robo不,不是真的。在元素创建之后,值被复制。@skr\u robo阿尔伽达斯所说的值被复制之后。创建一个默认的ctor,可能对值执行getter/setter,或者在创建对象后,通过为其分配一个新对象来使用复制ctor。我也会考虑存储指针而不是原始对象。@ SkryRoo如果它在一个循环中;那么调用更好的函数是