为什么map :: find需要我的参数不是const?

时间:2012-01-12 20:25:39

标签: c++ stl

std::map<Item*, item_quantity_t> _items;

bool Inventory::hasItem(Item const& item) {

    return (_items.find(&item) != _items.end() );

};

此代码不起作用,但将“hasItem”的输入类型更改为Item & item将起作用... 谁能解释为什么给我?我已经看到std :: find需要一个const引用,所以传递一个const对象应该没问题,至少这是我的理解

5 个答案:

答案 0 :(得分:3)

您已经定义了地图的键类型是指向非const项目Item*的指针。 find方法期望键类型的(const引用)值,因此它需要一个指向非const的指针。

展开模板时,参数类型findItem* const&

您可以更改hasItem以获取非const引用Item&,也可以将密钥类型更改为指向const项Item const*的指针。

答案 1 :(得分:2)

  

std :: find采用const引用

这是事实,但这意味着该方法不会修改Item *。为了传递const Item *&item是什么),您需要保证该方法不会修改基础Item。这种保证确实存在,但C ++无法说明。所以你必须写:

_items.find(const_cast<Item *>(&item))

告知C ++你知道这是安全的。

答案 2 :(得分:0)

由于你已经定义了地图以包含非常量指针,这就是你需要调用find的类型,而你无法从const引用中获得其中一个。您可以将键类型更改为const指针:

std::map<Item const *, item_quantity_t> _items;

答案 3 :(得分:0)

如果您的地图是指向const项目的指针,那将会有效:

std::map<const Item*, item_quantity_t> _items;

答案 4 :(得分:0)

std::map<Key, Value>::find()并不关心const传递的参数。但是,您似乎非常关心您的密钥类型是指向const的非Item指针,您无法获取Item const&的地址。也就是说,我怀疑你真的想用指针作为映射的关键。