C++将带有构造函数的对象插入映射表

9

我尝试了多种方法将内容插入到一个map中,其中插入一对数据的方法可以正常工作,代码如下:

type insert(){
    map<int,MyClass> myMap;
    MyClass myObj(parameter);
    myMap.insert(pair<int,MyClass>(0,myObj));
    ...
    return myMap;
}

然而,我决定采用另一种方式,基本上如下:
    map[key] = value;

而且,它看起来像这样:

type insert(){
    map<int,MyClass> myMap;
    MyClass myObj(parameter);
    myMap[i] = myObj;
    ....
    return myMap;
 }

编译器会给出错误提示:“调用myObj::myObj()的函数无匹配项,候选项为:”,并且这个函数是我自己定义的构造函数。
我的猜想是,当使用索引方式将对象转换为映射表时,如果传递的是一个对象,则会自动调用其没有参数的默认构造函数。但是,由于我已经有了一个带参数的自定义构造函数,因此编译器会报错。因此,我尝试创建一个值为对象的映射表,并且该对象只有默认构造函数。这样,编译器就不会抱怨了。
我的问题是,我没有找到任何文件证实我的想法。如果我的想法是正确的,为什么将值为对象的映射表调用默认构造函数而不是现有的构造函数呢?

1
http://en.cppreference.com/w/cpp/container/map/emplace 和 http://en.cppreference.com/w/cpp/container/map/find 可以很好地配合使用。 - chris
你的类需要一个空构造函数。 - jordsti
1
operator[] 对于要插入的对象需要一个默认构造函数。 使用 .insert(..) 或者 .emplace(..) 代替。 - Raja
也要使用C++11。http://www.cplusplus.com/reference/map/map/emplace/ - TheBuzzSaw
3个回答

18

问题在于std::map::operator[]实际上会返回给定索引上对象的引用,如果没有,则会默认构造一个。您的赋值操作发生在获取引用之后。

使用std::map::emplace直接就地构造一个对象:

myMap.emplace(i, parameter);

10

当您打电话时会发生什么

myMap[i] = myObj;

这意味着,如果没有带有键 i 的元素,则会插入一个具有初始化值的值(对于自定义类型来说,这意味着默认构造)的映射类型。然后,您将 RHS 赋值给它的值。第一部分要求该类型必须可默认构造。


1

std::map 要求你的类型必须有一个无参构造函数。点击此处 了解原因。


3
并不是整个 std::map 强制要求这一点。http://coliru.stacked-crooked.com/a/33dc0658a841ff7d - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接