如何在地图中放置一个“删除”复制ctor和赋值运算符的类?

时间:2014-01-07 13:22:11

标签: c++ copy-constructor assignment-operator

由于我使用的是非常完整的C ++ 11编译器(VS 11),我收到了一个关于防止使用复制ctor赋值运算符的链接器错误。一切都是花花公子,但问题是我不能把我的班级放在std::map,其中密钥是uin32_t,价值是我的班级。我甚至试过emplace,但它不起作用。

我正在考虑将std::move unique_ptr转变为map,但不想重新设计容器。那么有没有这样做的优雅方式(优雅==不喜欢在地图中放置一个假人,然后在值存储器上放置新的:)?

代码位是这样的:

std::map<uint32_t, LogFileWriter> m_map;

//declared not defined 
public:

LogFileWriter(const LogFileWriter& other);  // commenting this makes emplace work

3 个答案:

答案 0 :(得分:3)

std::map不适用于不可复制构造的对象。您有两种选择:

  • 使用std::shared_ptr<LogFileWriter>代替LogFileWriter作为地图值
  • 使用boost::ptr_map代替std::map

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

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

boost::ptr_map的文档位于:http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/ptr_map.html

答案 1 :(得分:2)

  

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");

答案 2 :(得分:0)

您有两种选择:

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