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对象应该没问题,至少这是我的理解
答案 0 :(得分:3)
您已经定义了地图的键类型是指向非const项目Item*
的指针。 find
方法期望键类型的(const引用)值,因此它需要一个指向非const的指针。
展开模板时,参数类型find
为Item* 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&
的地址。也就是说,我怀疑你真的想用指针作为映射的关键。