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?