由于我使用的是非常完整的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
答案 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)
您有两种选择: