【问题标题】:How to return a std::map item如何返回 std::map 项目
【发布时间】:2015-04-11 19:54:12
【问题描述】:

我在从类中的 std::map 返回项目时遇到问题。 我正在尝试创建一个简单的函数,例如

ExplorerObjectMapItem* MyClass::getFirst()
{
    mInternalMapIterator = mObserverLookup.begin();
    ExplorerObjectMapItem* item = &*mInternalMapIterator;
    return item;
}

使用以下类型定义的地方

typedef map< Subject*, shared_ptr<ExplorerObject> > ExplorerObjectMap;
typedef pair<Subject*, shared_ptr<ExplorerObject> > ExplorerObjectMapItem;
typedef ExplorerObjectMap::iterator                 ExplorerObjectIter;

map 和 iterator 是类成员:

ExplorerObjectMap                               mObserverLookup;
ExplorerObjectIter                              mInternalMapIterator;

上面的 getFirst() 函数代码给出了一个编译错误提示

E2034 Cannot convert 'pair<Subject * const,boost::shared_ptr<ExplorerObject>
 > *' to 'ExplorerObjectMapItem *'

不确定这里发生了什么。任何帮助表示赞赏。

【问题讨论】:

  • 附带说明 - 将键作为指针的映射非常容易出错。一个这样的错误是对指针值进行查找,并且该指针值不再有效。
  • 我明白了。该地图用于主题/观察者模式。主题消失后,我在正确移除观察者时遇到了问题。该地图有助于我在主题死亡时将主题指针设置为空。然后随后的“挤压”功能通过地图,删除所有观察者,其中主题为空,最终删除项目本身。现在不确定如何更改它..

标签: c++ dictionary std


【解决方案1】:

std::map&lt;K,V&gt; 不包含 std::pair&lt;K,V&gt; 对象。它包含std::pair&lt;const K, V&gt; 对象。缺少const 是导致转换失败的原因。

你可以解决这个问题

typedef pair<Subject* const, shared_ptr<ExplorerObject> > ExplorerObjectMapItem;

typedef ExplorerObjectMap::value_type ExplorerObjectMapItem;

【讨论】:

  • 太棒了!就是这样。做出改变似乎可以很好地解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 2010-09-15
  • 2014-06-01
  • 2019-03-15
相关资源
最近更新 更多