Как сделать boost unordered_map для поддержки flyweight

Я пытаюсь сделать следующее:

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.

10
задан lurscher 26 February 2012 в 13:45
поделиться