私はVisual C++ 2008を使ってWindowsビルドからC++プログラムを変換して、gcc 4.6.1でLinux上にビルドしています。 <unordered_map>
を使用するモジュールがあります。 VC++で、私たちが実際にそう純粋なC++ 2011のコードが実行可能ではない使用して、ちょうど4.6 gccとVC++ 2008よりも多くのコンパイラをサポートしているC++ std :: tr1 :: hash :: operator()undefined?
#include <unordered_map>
...
std::tr1::unordered_map<mystruct, int> my_map;
に完全にOKのようです。 GCCは、これが本当のブルーC++ 2011がそうファイル、私はこの仕事が
#include <tr1/unordered_map>
...
std::tr1::unordered_map<mystruct, int> my_map;
この作品に含める変更して作るためにしなければならなかったものの一つが含まれていることを訴えて、#include <unordered_map>
と怒ります。けっこうだ。しかし、私は別の問題を抱えています。ここでは体mystructの定義です:VC++ 2008で
struct mystruct
{
#ifdef __cplusplus
inline operator size_t() const
{
return m_val;
}
#endif
unsigned int m_val;
};
が、これはmystruct
に特化するほどstd::hash
としてニーズのようです。一方、std::tr1::hash
は、少なくともgcc 4.6.1ではなく、これを気に入っていません。 std::tr1::hash<mystruct>::operator()(mystruct) const
が定義されていないと不平を言ってリンクを拒否します。私はそれがVC++で起こるかどうかわからないが、適切なときにtr1
が含まれている - おそらく同じことについて不平を言うだろうか?私は明日それを試してみますが、今のところ私が持っているのはgccを持ったLinuxボックスです。今のところ、私はそれが働いて得るために、この操作を行う必要がありました:
namespace std {
namespace tr1 {
std::size_t hash<mystruct>::operator()(mystruct & c) const
{
return c.m_val;
}
}
}
誰もこれが動作するようになっているかに私を啓発することができますか?あなたがハッシュ可能にしたいタイプでsize_t
演算子を定義できるようにするのは非常にエレガントなようですが、私はstd::tr1::hash
にoperator()
を定義しています。
更新:
私は、提案されているように、ハッシュクラス全体を専門化しようとしました。 GCCとの建物は、私はあなたのmystruct
がユーザーによって定義されているので、あなたがunordered_map
のためにハッシュ関数を提供する必要が
myfile.cpp:41:12: error: specialization of 'std::tr1::hash<mystruct>' after instantiation
myfile.cpp:41:12: error: redefinition of 'struct std::tr1::hash<mystruct>'
/usr/include/c++/4.6/tr1/functional_hash.h:45:12: error: previous definition of 'struct std::tr1::hash<mystruct>'
まさに私が知りたいと思ったもの。ありがとうございました! –
興味深いことに、私はクラス全体を専門にしてみましたが、gccはそれを好まなかったのです。上記を参照。 –
@TedMiddleton上記参照? – Potatoswatter