我正在尝试使用QSet
来存储函数指针列表。有关更多详细信息,请参阅此代码。问题是这段代码不是通过 gcc/mingw 编译的。MSVC 正常编译它。我做错了什么?
typedef intptr_t (*UikHook)(intptr_t);
...
typedef struct
{
QSet<UikHook>* qsetSubscribers;
//QMutex* qmutexHook;
} THookableEvent;
...
THookableEvent* p = qmapHooks_.value(name);
if (p->qsetSubscribers == 0)
p->qsetSubscribers = new QSet<UikHook>();
p->qsetSubscribers->insert(hookProc);
error: no matching function for call to ‘qHash(long int (* const&)(long int))’
也许,我应该像文档中所说的那样为类型 UikHook
声明operator==
和函数qHash()
,但我不知道该怎么做,因为当我声明opertator==
时,我收到以下错误:
inline bool operator==(const UikHook &e1, const UikHook &e2)
error: ‘bool operator==(intptr_t (* const&)(intptr_t), intptr_t (* const&)(intptr_t))’
must have an argument of class or enumerated type
附言我正在使用Qt 5.8,gcc 6.2,msvc2015
更新:通过将QSet替换为QVector来解决。
为内置类型(如指针、整数或浮点数)定义operator==
。他们已经有了。您只需要提供一个qHash
。
使用函数指针并不是C++中的最佳实践。在早期的C++版本中,改用函子。自 C++11 以来,存在真正的函数对象。您可以通过std::function()
(引用)将函数指针转换为对象。
如果您列出的编译器是您需要支持的编译器,我强烈建议使用 std::function
而不是函数指针。
尝试(警告,大脑编译):
template <typename R, typename ...A>
inline uint qHash(R (*)(A...) const f) noexcept
{
return std::hash<R (*)(A...)>()(f);
}
Qt在这里得到了修复,因为它不能使用STL,并且哈希函数指针在某种程度上特定于编译器。