をサポートするために、ブーストunordered_mapを作るために、私は次の操作を実行しようとしています:どのようにフライ級<string>
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> > map;
boost::flyweight<std::string> foo(name);
map[foo] = foo;
しかし、コンパイラは文句: 「エラーC2665: 『後押し:: 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();
}
しかし、それはdoesn'tコンパイル。
flyweightをサポートするためにboost unordered_mapを行うには何が必要ですか?
[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;
I hash_valueのオーバーロードがうまくいかなかったことを理解できません。
'boost :: unordered_map'のデフォルトハッシャーは' boost :: hash_valueを使ってADLをトリガーしていないようです。 return hash_value(key); '。私は今それを確認することはできません。 – Xeo
@Xeoデフォルトのハッシャーは 'boost :: hash'でなければならず、' unordered_map'に特有であってはなりません。少なくともドクターはそう言います。 – pmr
もちろん、ADL対応の通話は使用されていないようには変わりません。 – Xeo