【问题标题】:MFC: Proper way to override HashKey() of CMap<> objects?MFC:覆盖 CMap<> 对象的 HashKey() 的正确方法?
【发布时间】:2019-12-26 22:13:23
【问题描述】:

我试图覆盖 MFC CMap 类的 HashKey() 函数。 Programming Windows with MFC Second Edition 的第 290 页给出了一个函数示例,例如:UINT AFXAPI HashKey(CString &amp; string),并说只使用特定类型。好吧,这只是导致错误,查找内容,现在似乎使用template&lt;&gt;。我们如何覆盖这些?示例:

typedef uint32_t myint_t;
CMap<myint_t, myint_t&, uint32_t, uint32_t&> m_MyCMap;

我想覆盖myint_t,但说它已经存在于afxtempl.h

如果我必须覆盖所有 int 类型,我怎么能这样做呢?这是我正在使用的唯一 CMap(据我所知,除非内部 MFC 也在使用一些,我认为这很有可能)。

那么如何正确地覆盖给定类型的CMap&lt;&gt;HashKey()

TIA!!

【问题讨论】:

    标签: collections mfc


    【解决方案1】:

    HashKey 的文档包含所有信息。它是一个函数模板,您需要提供与您的 ARG_KEY 模板类型参数(在您的情况下为 myint_t&amp;)匹配的特化:

    template <> UINT AFXAPI HashKey(myint_t& key)
    {
       // ...
    }
    

    标准 C++ 规则适用。特别是,您最多只能为任何给定类型提供一个专业化。 C++ 中的typedef 声明了一个类型alias;它没有引入新类型,并且您不能为相互别名的类型提供特化。

    MFC 中CMap 的此扩展点是为自定义类型提供的。如果您使用整数类型或基本 MFC 类型作为键,则需要接受 MFC 提供的散列函数。这与使用 std::map 等标准容器的行为基本相同。

    【讨论】:

    • 谢谢,我只尝试了 myint_t 密钥,所以现在尝试使用 myint_t& 密钥,但仍然不喜欢它。它说:错误C2766:显式专业化; 'UINT HashKey(ARG_KEY)' 已经用 [ARG_KEY=UINT & ] 定义
    • 这是预期的。您引入的不是用户定义类型,而是整数类型的别名。
    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2013-03-08
    • 1970-01-01
    相关资源
    最近更新 更多