我试图将方法插入到地图中,将一对插入到地图中工作正常,代码如下:
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()的匹配函数,候选者是:”它给出了我自己定义的构造函数。
我的猜测是,当使用索引方式转换为地图时,如果我要传入一个对象,那么它将自动调用其默认构造函数而不带参数。但由于我已经有一个带参数的自定义构造函数,因此会产生错误。因此,我尝试创建一个映射,其中值是一个对象,该对象只有默认构造函数。这样,编译器就不会抱怨。
我的问题是我找不到任何确认我的想法的文件。如果它是正确的,为什么具有对象值的映射调用默认构造函数而不是现有构造函数?
答案 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讨论原因。