类型 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>
.
我是 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>
.