0

GCC から次のエラー コードを簡単に検索したところ、この問題の解決を求める質問が多数ヒットしましたが、具体的な情報は何も見つかりませんでした。

error: explicit specialization of non-template 'std::hash'

std::hash は確かにテンプレートのように見えるため、問題が何であるかについてのエラーは明確ではありません。メッセージを生成するサンプル コードを以下に示します。GCC オプション -std=c++0x は、コードを問題なくコンパイルします。問題は、あるマシンで C++11 をサポートしない古いコンパイラを使用しているため、これがコンパイルされない理由を明確にすることが役立つことです。

別の方法は、特殊化の代わりに継承を使用することかもしれません。それが唯一の解決策である場合は、それも知っておくとよいでしょう。

#include <functional>

struct test
{
    int n;
};

namespace std
{
    template<>
        struct hash<test>
        {
        };
}
4

3 に答える 3

6

問題はstd::hash、 と、それを使用する順序付けられていないコンテナが、C++11 より前には存在しなかったことです。C++98 のみを理解するコンパイラを使用する必要がある場合は、使用できません。

同様のコンテナが TR1 および Boost で利用可能です。

于 2012-12-20T02:08:34.133 に答える
5

GCC の後の C++11 以前のバージョンでは、非標準のレガシーhash_setと実装は、 ではなく、hash_mapnamespace に配置されました。そのため、その一連のレガシー コンテナーのデフォルトのハッシュ ファンクターは、実際にはではなくです。さらに、AFAIKはの一部ではありません。__gnu_cxxstd__gnu_cxx::hash<T>std::hash<T><functional>

当時の標準化前の と の新たな実装はunordered_set名前空間にunordered_map常駐していました。つまり、関数のバージョンは実際にはではなく でした。std::tr1hashstd::tr1::hash<T>std::hash<T>

古いコンパイラを使用している場合は、必要なものを決定してください。

したがって、テンプレートのコンテキストでそれを使用しようとすると、コンパイラが不平を言う原因となっている、まったく関係のない非テンプレート名でstdたまたま宣言されていると思います。<functional>hash

于 2012-12-20T02:07:55.593 に答える
2

std::hashC++11 でのみ導入されました。したがって、C++98/C++03 に特化するtemplate <typename T> struct hash { ... };必要はありません。std

于 2012-12-20T02:07:04.950 に答える