类型 std::unordered_map 的 std::shared_ptr 的初始化编译错误

Compile error with initialization of an std::shared_ptr of type std::unordered_map

我是 C++ 智能指针的新手,在我的代码中的某个时刻我需要一个 unordered_map 的共享指针。我意识到我无法通过以下方式初始化 shared_ptr:

    typedef std::unordered_map<std::string, std::string> JsonDict;

    std::shared_ptr<JsonDict> ret = std::make_shared<JsonDict>(new JsonDict);

这是我遇到的编译错误:

*错误 C2664 'std::unordered_mapstd::string,std::string,std::hash<_Kty,std::equal_to<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>::unordered_map(const std::unordered_map<_Kty,_Ty,std::hash<_Kty>,std::equal_to<_Ty>,std::allocator<std::pair<const _Kty,_Ty>>> &)': 无法将参数 1 从 'std::unordered_mapstd::string,std::string,std::hash<_Kty,std::equal_to<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>> ' 转换为 'const std::allocator<std::pair<const _Kty,_Ty>> &' *

我不太明白为什么会出现此编译错误。

您不会自己分配对象,make_shared 会为您分配。它接受的参数用于构造对象本身,而不是指向它的指针。所以你的行应该读作

std::shared_ptr<JsonDict> ret = std::make_shared<JsonDict>();

(可以把它想象成“make_shared 是新的 new”,尽管人们最常说的是 make_unique。)

你的错误是试图分配自己的对象。所以你需要这样写:auto ret = std::make_shared<JsonDict>();std::shared_ptr<JsonDict> ret = std::make_shared<JsonDict>();.

出现错误的另一件事是因为你将 JsonDict 减速为 std::unordered_map<std::string, std::string> 并且你试图插入: std::unordered_map<std::string, std::string> 而不是 <std::string, std::string>.