C ++将带有构造函数的对象插入到map中

时间:2014-01-15 22:28:56

标签: c++ map constructor

我试图将方法插入到地图中,将一对插入到地图中工作正常,代码如下:

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()的匹配函数,候选者是:”它给出了我自己定义的构造函数。

我的猜测是,当使用索引方式转换为地图时,如果我要传入一个对象,那么它将自动调用其默认构造函数而不带参数。但由于我已经有一个带参数的自定义构造函数,因此会产生错误。因此,我尝试创建一个映射,其中值是一个对象,该对象只有默认构造函数。这样,编译器就不会抱怨。

我的问题是我找不到任何确认我的想法的文件。如果它是正确的,为什么具有对象值的映射调用默认构造函数而不是现有构造函数?

3 个答案:

答案 0 :(得分:12)

问题是std::map::operator[]实际上会返回对给定索引上的对象的引用,如果有非默认构造则引用。您的作业在获得参考后进行。

使用std::map::emplace直接构建对象:

myMap.emplace(i, parameter);

答案 1 :(得分:8)

致电

后会发生什么
myMap[i] = myObj;

是,如果没有带有键i的元素,则会插入一个初始化值(对于用户定义的类型表示默认构造的)映射类型。然后,为其分配分配的RHS上的值。第一部分要求类型是默认构造的。

答案 2 :(得分:1)

std::map要求您的类型必须具有无参数构造函数。 See here讨论原因。