Specializing std::hash for private member class

c++, c++11, hash, stdhash, unordered-set

Solution

Since it's a private inner type, I assume that you have a `private` or `protected` `std::unordered_map` member in the enclosing class. If that's the case, just write a private inner hash functor and pass it as the third argument of the `std::unordered_map`. It's the easiest solution to your problem, I think.

Problem

I have a class (call it `Outer`) which has a private member class (`Inner`). I want to store instances of `Outer::Inner` in unordered standard containers, so I want to specialize `std::hash<Outer::Inner>`. However, when writing this: ``` namespace std { template<> struct hash<Outer::Inner> { std::size_t operator()(const Outer::Inner &arg) const { return std::hash<int>()(arg.someSpecialProperty); } }; } ``` the compiler complains: ``` error: 'Inner' is a private member of 'Outer' std::size_t operator()(const Outer::Inner &p) const ^ ``` I have tried to make `std::hash` a friend struct by following this answer, but that didn't work either: the forward declaration of `Outer::Inner` failed with: ``` error: use of undeclared identifier 'Outer' ``` So how should I proceed (if what I intend to do is possible at all)?

Original source

Related problems