0

unordered_map 型のメンバーを MyClass に追加すると、コンパイル エラー C2440 が発生しました

operator== と hash_value() は既に定義されています。

#include <unordered_map>
namespace MyNameSpace {
    class MyClass {
    public: 
        struct SomeArg { int x; int y; };
        typedef void (MyClass::*FUNC)(MyClass*, MyClass::SomeArg);
        struct SomeTuple { MyClass::FUNC a; int b; int c; };
        void func(MyClass* myc, MyClass::SomeArg);
    private:
        // xfunctional(768): error C2440 'type cast' cannot convert 'SomeTuple' to 'size_t'
        std::unordered_map<SomeTuple, int> someMap; 
    }; // end of MyClass
    bool operator ==(const SomeTuple& a, const SomeTuple& b);
    std::size_t hash_value(const MyClass::SomeTuple& t);
}
namespace std { // already tried moving here
    //bool operator ==(const SomeTuple& a, const SomeTuple& b) { 
    //    return (a.a==b.a && a.b==b.b && a.c==b.c); 
    //}
    //size_t hash_value(const MyNameSpace::MyClass::SomeTuple& t) {
    //    size_t seed=0; boost::hash_combine(seed, t.x); boost::hash_combine(seed, t.y);
    //}
}

私は何が欠けていますか?

4

2 に答える 2

2

そうではありませんboost。タイプに特化std::hashするか、述語を に与える必要がありますmap

template <class Key,
class T,
class Hash = hash<Key>,
class Pred = std::equal_to<Key>,
class Alloc = std::allocator<std::pair<const Key, T> > >
class unordered_map;

あなたSomeTupleがクラスにいない場合unordered_map、 where 、 where KeyisSomeTupleが作成されます-簡単ですが、それ以外の場合-私には不可能に思えます。

#include <unordered_map>

namespace MyNameSpace {
    struct SomeTuple { int a; int b; int c; };
}

namespace std {
template<>
struct hash<MyNameSpace::SomeTuple>
{
   size_t operator ()();
};
}

namespace MyNameSpace {
    class MyClass {
    public: 
        struct SomeArg { int x; int y; };
        void func(MyClass* myc, MyClass::SomeArg);
    private:
        // xfunctional(768): error C2440 'type cast' cannot convert 'SomeTuple' to 'size_t'
        std::unordered_map<SomeTuple, int> someMap; 
    }; // end of MyClass
    bool operator ==(const SomeTuple& a, const SomeTuple& b);
}
于 2012-10-03T11:34:32.183 に答える
0

この bool MyClass::operator==(const SomeTuple& other) const を意味していたと思います

于 2012-10-03T11:30:53.960 に答える