Funkcja skrótu dla klasy zdefiniowanej przez użytkownika. Jak się zaprzyjaźnić? :)

Mam klasę C, która mastring* ps prywatny członek danych.
Teraz chciałbym miećunordered_map<C, int> dla których potrzebuję niestandardowej funkcji mieszającej.

Zgodnie z odniesieniem c ++, Mogę to zrobić jak

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

Problem polega na tym, że nie mogę tego zrobićoperator() iC przyjaciele, abym mógł uzyskać dostępps.

Próbowałem tego:

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

ale mówi, że typ niekompletny ... w specyfikacji zagnieżdżonej nazwy ...

Nie mogę też obrócić definicji, ponieważ jeśli klasa C zostanie zdefiniowana później,hash<C> nie ma o czym wiedziećps.

Co ja tu robię źle? Jak można naprawić tę sytuację bez robieniaps publiczny?

questionAnswers(2)

yourAnswerToTheQuestion