自定义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
相关产品推荐
相关产品推荐

