Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化std::无序映射类型的std::shared_ptr时发生编译错误_C++_C++11_Shared Ptr_Smart Pointers - Fatal编程技术网

C++ 初始化std::无序映射类型的std::shared_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

我不熟悉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::无序\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;