0

我正在尝试在另一个线程中运行非静态成员函数。如果我走:

void *(PortManager::*innerAskPtr)() = &this->innerAsk;
QFuture<void> f = QtConcurrent::run(innerAskPtr);

它提示

ISO C++ 禁止使用不合格或带括号的非静态成员函数的地址来形成指向成员函数的指针。

但如果我删除这个额外的参考符号:

void *(PortManager::*innerAskPtr)() = this->innerAsk;
QFuture<void> f = QtConcurrent::run(innerAskPtr);

它是这样的

无法将“PortManager::innerAsk”从“void (PortManager::)()”类型转换为“void* (PortManager::*)()”类型

在右侧添加什么以在左侧获得这些额外的星星(*)?

但是,即使我能到达那里,也总会有另一个错误;关于运行(T(*)()):

调用 'run(void* (PortManager::*&)()) 没有匹配的函数

我很难理解这个参考是如何到达那里的......

4

1 回答 1

2

QtConcurrent::run的文档似乎解释了这一切。

使用成员函数

QtConcurrent::run()还接受指向成员函数的指针。第一个参数必须是 const 引用或指向类实例的指针。调用 const 成员函数时,通过 const 引用传递很有用;通过指针传递对于调用修改实例的非常量成员函数很有用。

紧随本文后面有代码示例。

在您的代码中:

void *(PortManager::*innerAskPtr)() = this->innerAsk;
QFuture<void> f = QtConcurrent::run(innerAskPtr);

错误消息表明this->innerAsk返回void,但您正试图将其分配给返回成员函数的指针void *。你可能的意思是:

void (PortManager::*innerAskPtr)() = &PortManager::innerAsk;

但是你不需要为了调用而这样做QtConcurrent::run,因为代码示例显示你可以写:

QtConcurrent::run( this, &PortManager::innerAsk );
于 2014-06-04T03:01:38.173 回答