Я пытаюсь сделать следующее:
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();
}
Но он не компилируется.
Что мне нужно сделать, чтобы повысить unordered_map для поддержки flyweight?
[EDIT]
Я получил его для работы со следующим кодом:
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 не сработала.