Objecto como chave no CMap

Tenho uma turma chamada error_code. Uso - o como chave para std::map e CMap (MFC). Eu sou capaz de fazê-lo funcionar para std::map, mas não CMap. Posso saber como o posso fazer?

// OK!
std::map<error_code, int> m;
m[error_code(123)] = 888;

// error C2440: 'type cast' : cannot convert from 'error_code' to 'DWORD_PTR'
CMap <error_code, error_code&, int, int& > m; 
m[error_code(123)] = 888;

class error_code {
public:
    error_code() : hi(0), lo(0) {}
    error_code(unsigned __int64 lo) : hi(0), lo(lo) {}
    error_code(unsigned __int64 hi, unsigned __int64 lo) : hi(hi), lo(lo) {}

    error_code& operator|=(const error_code &e) {
        this->hi |= e.hi;
        this->lo |= e.lo;
        return *this;
    }

    error_code& operator&=(const error_code &e) {
        this->hi &= e.hi;
        this->lo &= e.lo;
        return *this;
    }

    bool operator==(const error_code& e) const {
        return hi == e.hi && lo == e.lo;
    }

    bool operator!=(const error_code& e) const {
        return hi != e.hi || lo != e.lo;
    }

    bool operator<(const error_code& e) const {
        if (hi == e.hi) {
            return lo < e.lo;
        }
        return hi < e.hi;
    }

    unsigned __int64 hi;
    unsigned __int64 lo;
};
 3
Author: Cheok Yan Cheng, 2011-01-04

1 answers

Um traço rápido mostra que a função do modelo diminui está a causar o erro:

template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
    // default identity hash - works for most primitive values
    return (DWORD)(((DWORD_PTR)key)>>4);
}

Uma correcção rápida implicaria adicionar uma função de conversão implícita ao tipo definido pelo utilizador. Eu não tenho certeza que dados serão armazenados assim que apenas escolher aleatoriamente algum atributo para formar os dados necessários.

class error_code {

    ...

    operator DWORD_PTR() const
    {
        return hi;
    }

    ...
}
 1
Author: YeenFei, 2011-01-04 08:20:44