Почему map :: find нужен мой параметр, чтобы не быть константой? - PullRequest
1 голос
/ 13 января 2012
std::map<Item*, item_quantity_t> _items;

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

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

};

Этот код не будет работать, но изменение типа ввода "hasItem" на Item & item будет работать ... Кто-нибудь может объяснить, почему мне?Я видел, что std :: find принимает константную ссылку, поэтому передача его константному объекту должна быть в порядке, по крайней мере, это то, что я понимаю

Ответы [ 5 ]

3 голосов
/ 13 января 2012

Вы определили, что типом ключа для вашей карты является указатель на неконстантный элемент, Item*.Метод find ожидает (постоянная ссылка на) значение типа ключа, поэтому для него требуется указатель на неконстантный.

При развертывании шаблонов тип параметра find равен Item* const&.

Вы можете либо изменить hasItem на неконстантную ссылку Item&, либо изменить тип своего ключа на указатель на постоянный элемент Item const*.

2 голосов
/ 13 января 2012

std :: find принимает константную ссылку

Это правда, но все это означает, что метод не изменит Item *.Чтобы передать const Item * (что и есть &item), вам потребуется гарантия, что метод не изменит базовый Item.Эта гарантия действительно существует, но C ++ не может этого сказать.Поэтому вам нужно написать:

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

, чтобы сообщить C ++, что вы знаете, что это безопасно.

0 голосов
/ 13 января 2012

std::map<Key, Value>::find() не заботится о переданном аргументе const. Тем не менее, вы, похоже, глубоко обеспокоены тем, что тип ключа не является const указателем на Item, который вы не получите, взяв адрес Item const&. Тем не менее, я сомневаюсь, что вы действительно хотите использовать указатели в качестве ключа к вашей карте.

0 голосов
/ 13 января 2012

Это сработало бы, если бы ваша карта была над указателями на постоянные предметы:

std::map<const Item*, item_quantity_t> _items;
0 голосов
/ 13 января 2012

Поскольку вы определили карту, чтобы она содержала неконстантные указатели, это тип, который вам нужно будет назвать find, и вы не можете получить один из них по константной ссылке.Вы можете изменить тип ключа на постоянный указатель:

std::map<Item const *, item_quantity_t> _items;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...