Сравнение указателей не имеет к этому никакого отношения. OP может или не может нуждаться в пользовательской операции сравнения; мне кажется, что они просто ищут конкретный объект по его адресу, что кажется вполне разумным. Первые два ответа, по-видимому, упустили момент, когда find () не компилируется, пока работает рукописный поиск.
Вызов find()
не скомпилируется, потому что вы передаете неверный тип для поиска. map::find()
ожидает, что его аргумент будет того же типа, что и тип ключа карты, который равен A*
. Вы передаете const A*
, который неявно конвертируется в A*
(но сравним с A*
, поэтому поиск по рукописи работает). Неявное преобразование работает только в другом направлении (A*
в const A*
, а не const A*
в A*
).
Возможно, вы должны использовать const A*
вместо A*
в качестве ключа карты; в зависимости от того, для чего вы используете карту, это может быть или не быть практичным. Если вам нужен ключ карты A*
, вам нужно передать A*
в find()
, что означает либо начинание с A*
в качестве цели поиска в первую очередь, либо, если вы можете только получить его из его исходного источника как const A*
, используя find(const_cast<A*>(a))
, чтобы превратить его в указатель на неконстантный (который не совпадает с неконстантным указателем, точкой, которая сбивает с толку многих C / C ++ кодеров). Обычно const_cast
нецелесообразно, но здесь это безопасно, поскольку вы только сравниваете указатель, а не разыменовываете его.