[英]How can I in-place construct an object of some class in an std::unorderd_map?
我想将多个从Qt::QGraphicsItem
派生的对象MyItem
存储在std::unordered_map
。 据我了解, Qt::QGraphicsItem
是不可复制的:复制构造函数是私有的。
这可以; 我不想复制MyItem
。 但是我需要就地构建MyItem
。 假设MyItem
具有以下构造函数签名:
MyItem::MyItem(int a, double b, std::string c);
这是我的std::unordered_map
:
std::unordered_map< KeyType, MyItem > myItemMap;
这行有什么问题,其中KeyType
是可复制的,并且在放置之前进行了构造:
myItemMap.emplace( correspondingKey, MyItem(3, 3.14, "hello") );
我收到此错误(剪切):
use of deleted function 'MyItem::MyItem(const MyItem&)'
: first(std::forward<_U1>(__x)), second(__y) { }
^
'MyItem::MyItem(const MyItem&)' is implicitly deleted because the default definition would be ill-formed:
'QGraphicsItem::QGraphicsItem(const QGraphicsItem&)' is private
myItemMap.emplace(...)
的参数必须看起来如何?
您正在构造一个MyItem
值,然后将其emplace
并尝试复制。 emplace
功能的重点是将结构留在map
。 这变得很复杂,因为您需要传递一pair
,而您要推迟second
pair
传递。
myItemMap.emplace(std::piecewise_construct,
std::forward_as_tuple(correspondingKey),
std::forward_as_tuple(3, 3.14, "hello"));
请参阅http://en.cppreference.com/w/cpp/container/unordered_map/emplace 。
如果将移动构造函数添加到MyItem
则代码将起作用:
MyItem(MyItem&& old)
: Base(old.parentItem())
{
for (QGraphicsItem* child : old.childItems()) {
child->setParentItem(this);
}
old.setParentItem(nullptr);
}
然后,实例将被自动移动而不被复制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.