C++ 初始化std::无序映射类型的std::shared_ptr时发生编译错误
我不熟悉C++的智能指针,在我的代码中,我需要一个无序映射的共享指针。我意识到我不能用以下方式初始化共享\u ptr:C++ 初始化std::无序映射类型的std::shared_ptr时发生编译错误,c++,c++11,shared-ptr,smart-pointers,C++,C++11,Shared Ptr,Smart Pointers,我不熟悉C++的智能指针,在我的代码中,我需要一个无序映射的共享指针。我意识到我不能用以下方式初始化共享\u ptr: typedef std::unordered_map<std::string, std::string> JsonDict; std::shared_ptr<JsonDict> ret = std::make_shared<JsonDict>(new JsonDict); 这是我得到的编译错误: *错误C2664'std
typedef std::unordered_map<std::string, std::string> JsonDict;
std::shared_ptr<JsonDict> ret = std::make_shared<JsonDict>(new JsonDict);
这是我得到的编译错误:
*错误C2664'std::无序\u映射std::string,std::string,std::hash::无序\u映射const std::无序\u映射&':
无法将参数1从'std::unordered_mapstd::string,std::string,std::hash'转换为
“const std::分配器&”*
我真的不明白为什么会出现这个编译错误。如果您没有自己分配对象,请让共享为您分配。它接受的参数用于构造对象本身,而不是指向对象的指针。所以你的台词应该是 std::shared_ptr ret=std::make_shared;
将其视为make_shared是新的,尽管人们经常说make_unique。您的错误是试图分配自己的对象。所以你需要这样写:auto ret=std::make_shared;或std::shared\u ptr ret=std::make\u shared 出现错误的另一个原因是,您正在减速JsonDict作为std::unordered_映射,并且您正在尝试插入一个:
std::无序映射而不是,。make\u shared接受构造函数参数。在您的情况下,只需执行std::shared\u ptr ret=std::make\u shared;因为JsonDict是无序映射,无序映射没有构造函数将指针指向另一个无序映射->你得到编译器错误阅读第1点:构造一个T类型的对象…是的,但我的问题是为什么我得到编译错误。我有一个工作代码,但我想知道为什么这行不工作。它应该进行双重分配并被编译,不是吗?@mahshidkhesrinejad不,这是因为您试图构造std::unordered_映射的实例,并将指向一个实例的指针作为构造参数传递。例如,试试JsonDict ret=新的JsonDict;