You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义qHash方法未被调用,QPoint作为QHash键仍可正常插入是否为预期行为?

结论

该现象属于正常情况,主要由以下两个原因导致:

  • Qt版本与官方内置实现的问题:你参考的是旧版Qt官方文档,Qt 5.10及更高版本已经在Qt核心命名空间中为QPoint内置了qHash函数实现,因此即使你注释了自定义的qHash函数,编译器仍然可以匹配到官方的实现完成哈希计算,插入操作自然可以正常执行,不会触发你写的全局自定义函数。
  • C参数依赖查找(ADL)规则限制:QPoint属于Qt核心命名空间下的类型,C在查找qHash函数时会优先在参数所属的命名空间中搜索匹配的函数,你定义在全局命名空间的qHash重载优先级低于Qt命名空间内的实现,自然不会被调用。

自定义qHash生效方案

如果确实需要使用自定义的哈希计算逻辑,只需要将你的qHash函数放到Qt核心命名空间内即可,示例如下:

#include <QPoint>
#include <QPair>
#include <QDebug>

QT_BEGIN_NAMESPACE
inline uint qHash(QPoint const &key, uint seed) {
  size_t hash = qHash(QPair<int, int>(key.x(), key.y()), seed);
  qDebug() << hash;
  return hash;
}
QT_END_NAMESPACE

修改完成后再运行代码,QHash就会优先调用你自定义的哈希函数。

补充说明

Qt官方提供的QPoint哈希实现已经做过哈希碰撞优化,无特殊业务需求的情况下直接使用官方实现即可,无需额外自定义。

内容的提问来源于stack exchange,提问作者richbai90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:06:02