由于我使用的是不完全C++11编译器(VS 11),因此我收到有关阻止使用复制ctor 赋值运算符的链接器错误。一切都是花花公子,但问题是我不能把我的班级放在一个关键是uin32_t
,价值是我的班级的std::map
。我什至尝试了emplace
,但它不起作用。
我正在考虑将unique_ptr
std::move
到map
中,但不希望重新设计容器。那么有没有优雅的方法可以做到这一点(优雅==不像将假人放在地图中,然后在值内存:)上放置新位置?
代码位如下所示:
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");
您有两个选择:
- 使用指向对象的指针。无需使用新版位。指针是可复制的,您甚至可以管理地图外部的生存期,只需使用地图中的原始指针将unique_ptr向量存储在其他位置即可。
- 为您的类提供一个移动构造函数。我不知道这当然是否可能,但可能是。