QSet <func pointer =“”>不能由gcc编译

时间:2017-01-25 12:55:15

标签: c++ qt gcc function-pointers qhash

我正在尝试使用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来解决。

3 个答案:

答案 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和散列函数指针在某种程度上是编译器特定的。