2012-01-12 8 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にはmyパラメータがconstでない必要がありますか?

+1

std :: map _items;一つの解決策かもしれない。 – tp1

答えて

3

マップのキータイプは、非constアイテム、Item*findメソッドは、キー型の(constへのconst参照)値を期待しているので、非constへのポインタが必要です。

テンプレートを展開すると、findのパラメータタイプはItem* const&になります。

hasItemを非const参照Item&に変更するか、またはキータイプをconstアイテムItem const*へのポインタに変更することができます。

0

非constポインタを含むようにマップを定義したので、これはfindを呼び出す必要があるタイプであり、const参照からそれらのポインタを取得することはできません。あなたはの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です。しかし、キータイプがconstItemへのポインタであることを深く心配しているようで、あなたはItem const&のアドレスを取ることはできません。つまり、あなたが実際にポインタをキーとして使用したいとは思っていません。

関連する問題