Подтвердить что ты не робот

Ошибка для хэш-функции пары ints

У меня есть следующий класс с членом unordered_map и хэш-функция, определенная для pair<int,int>

class abc
{public :
    unordered_map < pair<int,int> , int > rules ;
    unsigned nodes;
    unsigned packet ;     
};

namespace std {
template <>
    class hash < std::pair< int,int> >{
    public :
        size_t operator()(const pair< int, int> &x ) const
        {
            size_t h =   std::hash<int>()(x.first) ^ std::hash<int>()(x.second);
            return  h ;
        }
    };
}

Но я получаю следующие ошибки:

error: invalid use of incomplete type ‘struct std::hash<std::pair<int, int> >

error: declaration of ‘struct std::hash<std::pair<int, int> >

error: type ‘std::__detail::_Hashtable_ebo_helper<1, std::hash<std::pair<int, int> >, true>’ is not a direct base of ‘std::__detail::_Hash_code_base<std::pair<int, int>, std::pair<const std::pair<int, int>, int>, std::__detail::_Select1st, std::hash<std::pair<int, int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>’
4b9b3361

Ответ 1

К сожалению, эта программа имеет поведение undefined. С++ 11 §17.6.4.2.1:

Программа может добавлять специализацию шаблона для любого стандартного шаблона библиотеки к пространству имен std только в том случае, если объявление зависит от пользовательского типа, а специализация соответствует требованиям стандартной библиотеки для исходного шаблона и не запрещена явно.

hash<pair<int,int>> зависит только от примитивных и стандартных типов библиотек. Это легко обойти, определив свой хэш-класс вне пространства имен std и используя этот хэш явно в вашем объявлении карты:

struct pairhash {
public:
  template <typename T, typename U>
  std::size_t operator()(const std::pair<T, U> &x) const
  {
    return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
  }
};

class abc {
  std::unordered_map<std::pair<int,int>, int, pairhash> rules;
};

EDIT: я использовал xor для объединения хэшей членов пары здесь, потому что я ленив, но для серьезного использования xor - это довольно дрянное сочетание функций хеша.