我正在尝试使用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))’
也许,我应该像文档中所说的那样,为类型operator==
声明qHash()
和函数UikHook
,但我不知道该怎么做,因为当我宣布{ {1}},我收到以下错误:
opertator==
P.S。我正在使用Qt 5.8,gcc 6.2,msvc2015
更新:通过将QSet替换为QVector来解决。
答案 0 :(得分:2)
您无法为内置类型定义operator==
,例如指针,整数或浮点数。他们已经拥有它。您只需提供qHash
。
答案 1 :(得分:1)
使用函数指针并不是C ++中的最佳实践。在早期的C ++版本中,使用了仿函数。从C ++ 11开始,就有了真正的函数对象。您可以通过std::function()
(Reference)将函数指针转换为对象。
如果您列出的编译器是您需要支持的编译器,我强烈建议您使用std::function
而不是函数指针。
答案 2 :(得分:0)
尝试(警告,脑编译):
template <typename R, typename ...A>
inline uint qHash(R (*)(A...) const f) noexcept
{
return std::hash<R (*)(A...)>()(f);
}
Qt在这里是一个修复,因为它不能使用STL和散列函数指针在某种程度上是编译器特定的。