c++ - 对象作为 CMap 中的键

标签 c++ mfc

我有一个名为 error_code 的类。我将它用作 std::mapCMap (MFC) 的键。我能够使其适用于 std::map,但不适用于 CMap。我可以知道我该怎么做吗?

// 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;
};

最佳答案

快速跟踪显示下面的模板函数导致了错误:

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);
}

一个快速修复方法是向用户定义的类型添加隐式转换函数。 我不确定将存储什么数据,所以只是随机选择一些属性来形成所需的数据。

class error_code {

    ...

    operator DWORD_PTR() const
    {
        return hi;
    }

    ...
}

关于c++ - 对象作为 CMap 中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4591579/

相关文章:

c++ - move 自定义容器的构造函数?

c++ - CFileDialog 在 Windows XP 下保留目录句柄

c++ - 如何在 MFC 项目中打开 GDI+ 1.1 而不是 1.0?

c++ - CDateTimeCtrl 编辑短年份格式

c++ - 垂直于给定线的画线

c++ - 用户定义类的大小

c++ - 将 exr/pfm 保存为小端

c++ - 动态输出文件名 (C++)

c++ - 如何将MFC时间/日期控件设置为24小时制

c++ - 如何从标识符创建类?