C++ 自定义类指针作为无序映射键

C++ 自定义类指针作为无序映射键,c++,c++11,C++,C++11,我试图用指向自定义类的指针作为键,整数作为值来实现无序的_映射 我认为指针只是一个地址,所以我不必为无序的映射创建比较模板,因为映射会在地址之间进行比较。但我得到了编译错误。 对于简单的测试,我的代码如下。谁能帮我纠正我做错了什么 #include <cstdlib> #include <unordered_map> #include <iostream> using namespace std; class MyClass{ public:

我试图用指向自定义类的指针作为键,整数作为值来实现无序的_映射
我认为指针只是一个地址,所以我不必为无序的映射创建比较模板,因为映射会在地址之间进行比较。但我得到了编译错误。
对于简单的测试,我的代码如下。谁能帮我纠正我做错了什么

#include <cstdlib>
#include <unordered_map>
#include <iostream>

using namespace std;

class MyClass{
    public:
        MyClass(int id){m_id = id;};
        void PrintThis(){cout << " This is test " << endl;};
        int m_id;
};


class Test{
    public:
        unordered_map<MyClass* mc, int test> mapTest;

};

int main(){
    MyClass* mc1 = new MyClass(1);
    MyClass* mc2 = new MyClass(2);

    Test* tt1 = new Test();
    tt1->mapTest.insert(make_pair<MyClass*, int>(mc1, 10));
    tt1->mapTest.insert(make_pair<MyClass*, int>(mc2, 20));

    auto search = tt1->find(mc1);
    if(search != tt1->end()) {
        search->first->PrintThis();
    }else{
        cout << "not Found " << endl;
    }

}
#包括
#包括
#包括
使用名称空间std;
类MyClass{
公众:
MyClass(int-id){m_-id=id;};
void PrintThis(){cout mapTest.insert(make_pair(mc2,20));
自动搜索=tt1->查找(mc1);
如果(搜索!=tt1->end()){
搜索->第一->打印此();
}否则{
cout-mapTest.insert(make_对(mc1,10));
我想我可以处理第26行的错误,如果第17行得到修复


提前感谢!

您对
无序地图测试的声明是无效语法。它应该是
无序地图测试


另外,从
make_pair
调用中删除模板参数,并将
tt1->find
更改为
ttl->mapTest.find()
ttl->end()
更改为
ttl->mapTest.end()


另外,从您的
make\u pair
调用中删除模板参数,并将
tt1->find
更改为
ttl->mapTest.find()
ttl->end()
更改为
ttl->mapTest.end()

  • 地图声明:应为
    std::无序地图
  • 调用未定义的函数(
    tt1->find
    /
    tt1->end
    ,应为
    tt1->testMap.XXX
  • 调用
    make\u-pair
    不需要模板参数。编译器将推断它们。这实际上会导致一个问题,因为编译器试图调用
    make\u-pair(MyClass*&&,int&&&)
    。如果忽略模板参数,它会工作(
    make\u-pair(mc1,10)
  • 关于第3点:

    make_pair在C++11中声明如下(C++14只是添加了
    constexpr
    ):


    由于您的参数是左值,因此无法将其转换为右值引用,并且编译失败

    我尝试了您的代码,发现了3个问题:

  • 地图声明:应为
    std::无序地图
  • 调用未定义的函数(
    tt1->find
    /
    tt1->end
    ,应为
    tt1->testMap.XXX
  • 调用
    make\u-pair
    不需要模板参数。编译器将推断它们。这实际上会导致一个问题,因为编译器试图调用
    make\u-pair(MyClass*&&,int&&&)
    。如果忽略模板参数,它会工作(
    make\u-pair(mc1,10)
  • 关于第3点:

    make_pair在C++11中声明如下(C++14只是添加了
    constexpr
    ):


    由于您的参数是左值,因此无法将其转换为右值引用,编译失败

    请发布错误消息。我想说错误消息与您的问题非常相关,您是否同意?请查看以下答案:@AlexZywicki此处的键是指向类的指针,指针已经可以散列。请发布错误消息r消息。我想说错误消息与您的问题非常相关,您是否同意?请参见以下答案:@AlexZywicki这里的键是指向类的指针,指针已经可以散列。他还试图通过他的类变量而不是通过实际的成员变量访问
    std::unordered_map
    实例可以。他还试图通过他的类变量而不是实际的成员变量访问
    std::unordered_map
    实例。非常感谢!对于1,我修改为建议。对于2,是一个错误。tt1->mapTest.find(mc1)是正确的。对于3,谢谢!:)非常感谢!对于1,我修改为建议。对于2,是一个错误。tt1->mapTest.find(mc1)是正确的。对于3,谢谢!:)
    ./main.cpp:17:44: error: wrong number of template arguments (1, should be 5)
             unordered_map<MyClass* mc, int test> mapTest;
                                                ^
    In file included from /usr/include/c++/4.8/unordered_map:48:0,
                     from ./main.cpp:2:
    /usr/include/c++/4.8/bits/unordered_map.h:97:11: error: provided for 'template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> class std::unordered_map'
         class unordered_map : __check_copy_constructible<_Alloc>
               ^
    ./main.cpp: In function 'int main()':
    ./main.cpp:26:18: error: request for member 'insert' in 'tt1->Test::mapTest', which is of non-class type 'int'
         tt1->mapTest.insert(make_pair<MyClass*, int>(mc1, 10));
    
    template< class T1, class T2 >
    std::pair<V1,V2> make_pair( T1&& t, T2&& u );
    
    std::make_pair<MyClass *&, int>(MyClass *&, int &&);
    
    std::make_pair<MyClass *, int>(MyClass *&&, int &&).