QSet<func 指针> 不由 gcc 编译



我正在尝试使用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,并且哈希函数指针在某种程度上特定于编译器。

相关内容

  • 没有找到相关文章

最新更新