私は次のことをしようとしています:
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を作成するには何をする必要がありますか?
[編集]次のコードで動作するようになりました:
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のオーバーロードが機能しなかった方法がわかりません。