首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSet<func pointer>没有编译,作者: gcc

QSet<func pointer>没有编译,作者: gcc
EN

Stack Overflow用户
提问于 2017-01-25 20:55:15
回答 3查看 202关注 0票数 1

我正在尝试使用QSet来存储函数指针列表。有关更多详细信息,请参阅此代码。问题是这段代码不能由gcc/mingw编译。MSVC会正常编译它。我做错了什么?

代码语言:javascript
复制
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==时,我得到了以下错误:

代码语言:javascript
复制
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解决了此问题。

EN

回答 3

Stack Overflow用户

发布于 2017-01-25 21:02:31

您不能为内置类型定义operator==,例如指针、整数或浮点数。他们已经有了。您只需要提供一个qHash

票数 2
EN

Stack Overflow用户

发布于 2017-01-25 21:04:54

在C++中使用函数指针并不是真正的最佳实践。在早期的C++版本中,使用的是函数式。从C++11开始,就有了真正的函数对象。您可以通过std::function() (Reference)将函数指针转换为对象。

如果您列出的编译器是您需要支持的编译器,我强烈建议使用std::function而不是函数指针。

票数 1
EN

Stack Overflow用户

发布于 2017-01-26 16:26:49

Try (警告,brain编译):

代码语言:javascript
复制
template <typename R, typename ...A>
inline uint qHash(R (*)(A...) const f) noexcept
{
  return std::hash<R (*)(A...)>()(f);
}

Qt在这里有一个修复,因为它不能使用STL和散列函数指针在某种程度上是编译器特定的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41852174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档