Función hash para la clase definida por el usuario. ¿Cómo hacer amigos? :)

Tengo una clase C, que tiene unastring* ps miembro de datos privados.
Ahora, me gustaría tener unaunordered_map<C, int> Para lo que necesito una función hash personalizada.

Según la referencia de c ++, Puedo hacer eso así

namespace std {
  template<>
  class hash<C> {
  public:
    size_t operator()(const C &c) const
    {
      return std::hash<std::string>()(*c.ps);
    }
  };
}

El problema es que parece que no puedo haceroperator() yC amigos para que yo pudiera accederps.

He intentado esto:

class C;
template<>
class std::hash<C>;
class C{
  //...
  friend std::hash<C>::operator ()(const C&) const; // error: Incomplete type 
};
// define hash<C> here.

pero dice que el tipo incompleto ... en el especificador de nombre anidado ...

Tampoco puedo cambiar las definiciones, porque si la clase C se define más adelante, lahash<C> no tiene manera de saber sobreps.

¿Qué estoy haciendo mal aquí? ¿Cómo se puede arreglar esta situación sin hacerps ¿público?

Respuestas a la pregunta(2)

Su respuesta a la pregunta