繁体   English   中英

如何在std :: unorderd_map中就地构造某个类的对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM