Специализация std :: hash для закрытого члена класса

У меня есть класс (назовите это Outer) который имеет закрытый член класса (Inner). Я хочу хранить экземпляры Outer::Inner в неупорядоченных стандартных контейнерах, поэтому я хочу специализироваться std::hash<Outer::Inner>,

Однако при написании этого:

namespace std {
template<>
struct hash<Outer::Inner> {
std::size_t operator()(const Outer::Inner &arg) const
{
return std::hash<int>()(arg.someSpecialProperty);
}
};
}

компилятор жалуется:

error: 'Inner' is a private member of 'Outer'
std::size_t operator()(const Outer::Inner &p) const
^

Я пытался сделать std::hash структура друга, следуя этот ответ, но это тоже не сработало: предварительная декларация Outer::Inner не удалось с:

error: use of undeclared identifier 'Outer'

Так как мне действовать (если то, что я собираюсь сделать, возможно вообще)?

3

Решение

Так как это частный внутренний тип, я предполагаю, что у вас есть личный / защищенный std::unordered_map член на вмещающем классе. Если это так, просто напишите частный внутренний хеш-функтор и передайте его в качестве третьего аргумента std::unordered_map, Я думаю, это самое простое решение вашей проблемы.

4

Другие решения

Понял ! Решение состоит в том, чтобы использовать ваши собственные функторы, а не специализировать std :: hash.

struct A
{
A() { v.insert(std::make_pair(B(1), 6)); }

private:
struct B
{
B(int i = 0) : m_i(i) { }

int m_i;
};

struct HashB { std::size_t operator()(const B& b) const { return b.m_i; } };
struct EqualB { bool operator()(const B&b1, const B&b2) const { return b1.m_i == b2.m_i; } };std::unordered_map<B, int, HashB, EqualB> v;
};
8

По вопросам рекламы [email protected]