我第一次使用 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>'
有什么想法吗?
问题不在于
shared_ptr
,而在于string
键。 显式实例化将解决这个问题。 您还需要插入一个由键和值组成的pair
,而不是单独的键和值:
map.insert(std::make_pair (std::string("string"), std::make_shared<ClassB>()));
另请参阅此相关答案,了解更新颖、但更复杂的解决方案。
initializer_list 也可以解决你的问题。
map.insert( {"string", std::make_shared<ClassB>()} );
由于您需要将
pair
插入到地图中,因此您也可以使用 emplace
代替 insert
,因此它将使用给定的键和值就地构造 pair
。
https://en.cppreference.com/w/cpp/container/unordered_map/emplace
map.emplace("string", std::make_shared<ClassB>());