所以我有一个应该返回以下映射的函数:
map<MyObj*, Datastruct>
尝试从包含所述对象的列表中插入对象时:
for(auto element: myList){
Datastruct str;
str.property1 = element.property1;
str.property2 = element.property2;
saidMap.insert(element.PointerToMyObj, str);
}
myList 中的对象包含一个指向myObj的指针以及一些我需要从列表移动到地图的属性。在以下函数中执行了此代码:
map<MyObj*, Datastruct> listToMap = convertList(myList);
我被编译器大喊:
“没有匹配的函数可以调用'std :: map :: insert(MyObj *&,Datastruct&)”
我在这里很无助。我不知道为什么如果myList中的 element 包含
,编译器将显示我试图传递对该函数的引用MyObj * PointerToMyObj;
从我的角度来看,哪种是正确的类型可以传递给insert函数? 我也尝试过
std :: make_pair
随后,编译器大喊大叫,试图将对插入
map<MyObj*, Datastruct>.
我完全迷路了。有人可以告诉我我在做什么错吗?
答案 0 :(得分:3)
地图的值类型不是
std::pair<MyObj*, Datastruct>
但是
std::pair<MyObj* const, Datastruct>
大概是您在某处对配对类型进行了硬编码,但是错过了const
。
或者,如果您编写了saidMap.insert(std::make_pair(element.PointerToMyObj, str))
,那应该行得通,而代码中还有其他问题。
但是使用emplace
要容易得多:
saidMap.emplace(element.PointerToMyObj, str);
此insert
的C ++ 11版本具有使该功能“透明”运行所需的所有魔术机制。
答案 1 :(得分:1)
您的代码几乎是 。由于map::insert
确实没有这样的重载,您会收到此编译器错误。在阅读std::map
文档时,您会错过一个很小的细节。这样map::insert
不能用作隐式构造函数,这就是您尝试在粘贴的代码中使用它的方式。
您可以通过添加-map::emplace
:
for(auto element : myList){
Datastruct str;
str.property1 = element.property1;
str.property2 = element.property2;
saidMap.emplace(element.PointerToMyObj, str);
}
使用map::insert()
:插入功能用于在地图中插入 键值 对,并且具有3个< em> general 重载实际上更多,但是这些是如何在地图中插入的主要思想。
key
,pair.second是value
。仅在键尚未在地图中时发生。it
是指向要在其中插入对的位置的指针。begin
和end
。在您的情况下,您实际上错过了通过pair
的机会。您可以在插入参数列表内部构造它,如下所示:
for(auto element : myList){
Datastruct str;
str.property1 = element.property1;
str.property2 = element.property2;
saidMap.insert( /*implicitly derive a pair as:*/ { element.PointerToMyObj, str } );
}
注意:这是 post-C ++ 11 功能,因此请确保至少将编译器的C ++版本设置为该版本。
我已在 Compiler Explorer(godbolt)中使用map::insert
的工作版本复制了您的代码,供您查看(在gcc
和{{1 }}编译器):https://godbolt.org/z/7Mqut0。
希望这会有所帮助!