Я пытаюсь сделать следующее:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> > map;
boost::flyweight<std::string> foo(name);
map[foo] = foo;
Но компилятор жалуется: «ошибка C2665: 'boost :: hash_value': ни одна из 17 перегрузок не смогла преобразовать все типы аргументов».
Но я определил следующую функцию:
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();
}
Но она не компилируется.
Что мне нужно сделать, чтобы boost unordered_map поддерживал легковес?
[РЕДАКТИРОВАТЬ] Я заставил его работать с помощью следующего кода:
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);
}
};
и передал его в качестве параметра шаблона при построении карты:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> , flyweight_hash > map;
В этом случае я не понимаю, как не сработала перегрузка hash_value.