首页 > 解决方案 > 如何使用 emplace 在 C++ 中添加地图?

问题描述

尝试将条目添加到地图时出现编译错误。

地图声明:

std::map<std::string, Network::ClientConnectionPtr> activeUpstreamConnections_

添加到地图(这会导致编译错误如下所示):

 activeDownstreamConnections_.emplace(identifier, clientConnectionPtr);

/usr/include/c++/7/ext/new_allocator.h:136:4: 错误:没有匹配函数调用'std::pair, std::unique_ptr ::pair(std::__cxx11::basic_string&, std ::unique_ptr&)'

下面的代码有效,但我以后无法使用 clientConnectionPtr 的值:

activeDownstreamConnections_.emplace(std::move(identifier), std::move(clientConnectionPtr));

我本质上是在尝试保留已建立的 TCP 连接的地图。如何修复编译错误并仍然能够重新使用存储在地图中的连接?

标签: c++

解决方案


从错误消息来看,它似乎Network::ClientConnectionPtr是一个std::unique_ptr,它是一个只移动类,它对动态分配的对象的唯一所有权进行建模。

因此,您必须std::move在地图内使用它,因为它是不可复制的。要使用您在地图中放置的连接,您可以简单地通过查找访问它们,或存储原始指针/引用。例如

auto res = activeDownstreamConnections_.emplace(
    std::move(identifier), std::move(clientConnectionPtr)); 

auto& connection = res.first->second;
// use `connection`...

推荐阅读