std::unordered_map 插入错误shared_ptr c++

问题描述 投票:0回答:3

我第一次使用 std::unordered_map 并且在插入我创建的地图时遇到问题。

A 类标头:

Class ClassA
{
public:
    void func();
private:
    std::unordered_map<std::string, std::shared_ptr<ClassB>> map;
}

A类cpp:

void ClassA::func()
{
    map = std::unordered_map<std::string, std::shared_ptr<ClassB>>();
    map.insert("string", std::make_shared<ClassB>());
}

我收到错误 c2664 std::_List_iterator<_Mylist> std::_Hash<_Traits>::insert(std::_List_const_iterator<_Mylist>,std::pair<_Ty1,_Ty2> &&)' :无法将参数 1 从 'const char [17]' 转换为 'std ::_List_const_iterator<_Mylist>'

有什么想法吗?

c++ insert unordered-map
3个回答
4
投票

问题不在于

shared_ptr
,而在于
string
键。 显式实例化将解决这个问题。 您还需要插入一个由键和值组成的
pair
,而不是单独的键和值:

map.insert(std::make_pair (std::string("string"), std::make_shared<ClassB>()));

另请参阅此相关答案,了解更新颖、但更复杂的解决方案。


2
投票

initializer_list 也可以解决你的问题。

map.insert( {"string", std::make_shared<ClassB>()} );

0
投票

由于您需要将

pair
插入到地图中,因此您也可以使用
emplace
代替
insert
,因此它将使用给定的键和值就地构造
pair
https://en.cppreference.com/w/cpp/container/unordered_map/emplace

map.emplace("string", std::make_shared<ClassB>());
© www.soinside.com 2019 - 2024. All rights reserved.