2

私はVisual Studio 2012を使用しています。これを試すと:

std::unordered_set<std::shared_ptr<A>> myset;

次のエラーが表示されます。

エラー C2338: C++ 標準は、この型のハッシュを提供していません。

標準およびこのエラー レポート ( https://connect.microsoft.com/VisualStudio/feedback/details/734888#tabs ) によると、これはコンパイルする必要があり、Microsoft は VC++11 でサポートを実装しています。では、なぜこれが機能しないのでしょうか。

編集:これを機能させるにはどうすればよいですか? リンクされたページで回避策を試しましたが、ハッシュ関数が既に定義されているというエラーが表示されます。案の定、VC ディレクトリの「メモリ」ファイルの 1803 行目には次のようなものがあります。

template<class _Ty>
    struct hash<shared_ptr<_Ty> >
        : public unary_function<shared_ptr<_Ty>, size_t>
    {   // hash functor
    typedef shared_ptr<_Ty> _Kty;
    typedef _Ty *_Ptrtype;

    size_t operator()(const _Kty& _Keyval) const
        {   // hash _Keyval to size_t value by pseudorandomizing transform
        return (hash<_Ptrtype>()(_Keyval.get()));
        }
    };

通常は私のせいなので、コンパイラのせいにするのは気が進まないのですが、今回は本当に彼らがめちゃくちゃになったようです...

4

2 に答える 2

1

お使いのバージョンの MSVC ではサポートされていないと思いますが、リンク先のページの [回避策] タブに使用可能な回避策があります。基本的にstd::hash、(このコンパイラで) この型を自分で実装するだけです。

于 2013-06-24T11:58:10.233 に答える