próbuję wykonać następujące czynności:Jak dokonać doładowania unordered_map wspierać muszej <string>
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> > map;
boost::flyweight<std::string> foo(name);
map[foo] = foo;
Ale kompilator narzeka: „błąd C2665:«boost :: hash_value»: żaden z 17 przeciążeń może przekonwertuj wszystkie typy argumentów ".
Ale zdefiniowano następujące funkcje:
std::size_t hash_value(const boost::flyweight<std::string> & b)
{
boost::hash<std::string> hasher;
const std::string & str = b.get();
return hasher(str);
}
bool operator==(const boost::flyweight<std::string>& f, const boost::flyweight<std::string> & second)
{
return f.get() == second.get();
}
Ale to doesnt skompilować.
Co muszę zrobić, aby wzmocnić unordered_map, aby obsługiwać muszkę?
[EDIT] Dostałem go do pracy z następującego kodu:
struct flyweight_hash
{
std::size_t operator()(const boost::flyweight<std::string> &elm) const
{
boost::hash<std::string> hasher;
const std::string & str = elm.get();
return hasher(str);
}
};
i przekazał go jako parametr szablonu do budowy mapy:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> , flyweight_hash > map;
W tym przypadku nie rozumiem, jak przeciążanie hash_value nie zadziałało.
Jest tylko zły, ponieważ domyślny haszownik 'boost :: unordered_map' nie wydaje się wywoływać ADL przez' using boost :: hash_value; return hash_value (klucz); '. Nie mogę tego teraz sprawdzić. – Xeo
@Xeo Domyślny hasz powinien być 'boost :: hash' i nie powinien być specyficzny dla' unordered_map'. Przynajmniej doktor tak mówi. – pmr
Oczywiście, ale to nie zmienia faktu, że połączenia obsługujące ADL nie wydają się być używane. – Xeo