Мне непонятно, из стандарта С++ 11, где должны быть определены пользовательские функции hash<T>
.
Например, в 23.5.2 Заголовок <unordered_map>
он показывает:
template <class Key,
class T,
class Hash = hash<Key>,
class Pred = std::equal_to<Key>,
class Alloc = std::allocator<std::pair<const Key, T> > >
class unordered_map;
Это говорит о том, что по умолчанию в глобальном пространстве имен выполняется поиск hash<T>
, тогда как equal_to<>
выполняется поиск в пространстве имен std
.
Почему разница в пространстве имен между hash<>
и equal_to<>
?
(На самом деле, в описании http://www.cplusplus.com/reference/unordered_map/unordered_map/ ни одно из них не указывает пространство имен std
.)
Таким образом, при определении функтора hash<>
для пользовательского типа мы должны заключить его в блок namespace std { }
или он может оставаться в текущем пространстве имен?
Если код не имеет using namespace std;
, то как контейнеры STL, такие как unordered_map
, знают, что нужно искать в пространстве имен std
для предопределенных функторов hash<>
, связанных с примитивными типами? Похоже, что по умолчанию Hash = hash<Key>
не сможет найти их.
Извините, если это глупые вопросы.