2012-01-12 222 views
1
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對象應該沒問題,至少它是我的理解爲什麼map :: find需要我的參數不是const?

+1

std :: map _items;可能是一個解決方案。 – tp1 2012-01-12 20:28:04

回答

3

你已經定義了你的映射的鍵類型是一個指向non-const Item,Item*find方法需要鍵類型的(const引用a)值,所以它需要一個指向非const的指針。

展開模板時,參數類型findItem* const&

您可以將hasItem更改爲非const參考Item&,也可以將您的密鑰類型更改爲指向常量項Item const*的指針。

0

由於您已經將地圖定義爲包含非常量指針,因此您需要調用find,並且您無法從常量引用中獲取其中的一個。您可以在關鍵類型更改爲一個const指針:

​​
0

請將您的地圖是在一個指針爲const項工作:

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

的std ::發現需要一個const引用

這是真的,但它意味着該方法不會修改Item *。爲了通過const Item *(這是&item是什麼),您需要保證該方法不會修改底層的Item。這個保證確實存在,但C++不能說明這一點。所以你必須寫:

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

通知C++,你知道這是安全的。

0

std::map<Key, Value>::find()不在乎通過的參數const。但是,您似乎對您的密鑰類型非常關心,因爲指向Item的非const指針,您將無法從Item const&的地址獲得該指針。這就是說,我懷疑你真的想用指針作爲你映射的關鍵。

相關問題