如何在map中放置具有"deleted"复制ctor和赋值运算符的类?



由于我使用的是不完全C++11编译器(VS 11),因此我收到有关阻止使用复制ctor 赋值运算符的链接器错误。一切都是花花公子,但问题是我不能把我的班级放在一个关键是uin32_t,价值是我的班级的std::map。我什至尝试了emplace,但它不起作用。

我正在考虑将unique_ptr std::movemap中,但不希望重新设计容器。那么有没有优雅的方法可以做到这一点(优雅==不像将假人放在地图中,然后在值内存:)上放置新位置?

代码位如下所示:

std::map<uint32_t, LogFileWriter> m_map;
//declared not defined 
public:
LogFileWriter(const LogFileWriter& other);  // commenting this makes emplace work
std::map不是

为处理不可复制构造的对象而设计的。您有两种选择:

  • 使用 std::shared_ptr<LogFileWriter> 而不是 LogFileWriter 作为映射值
  • 使用boost::ptr_map而不是std::map

如果已经使用共享指针管理LogFileWriter对象,则应使用第一个解决方案,否则使用第二个解决方案。

将原始指针插入boost::ptr_map,其析构函数会在适当的时候为您调用delete。请注意,insert 方法具有不同的签名(将键作为第一个参数,将指向值的指针作为第二个参数),并且出于某种不透明的原因,您必须提供键作为非 const 左值引用。

boost::ptr_map的文档在这里:http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/ptr_map.html

if ( ! mymap.count(ip)) mymap.emplace(pair<uint32_t, LogFileWriter>(source_ip, LogFileWriter(somestring+ ".log")));

您对 pair 构造函数的调用尝试将临时LogFileWriter复制/移动到pair中。将pair传递给emplace并不能阻止这种情况的发生。

你应该做mymap.emplace(source_ip, somestring+".log");

您有两个选择:

  1. 使用指向对象的指针。无需使用新版位。指针是可复制的,您甚至可以管理地图外部的生存期,只需使用地图中的原始指针将unique_ptr向量存储在其他位置即可。
  2. 为您的类提供一个移动构造函数。我不知道这当然是否可能,但可能是。

最新更新