如何获取在QtConcurrent中使用的非静态成员函数的地址

How to take address of non-static member function to use within QtConcurrent?

本文关键字:静态成员 地址 函数 QtConcurrent 何获取 获取      更新时间:2023-10-16

我试图在另一个线程中运行非静态成员函数。如果我输入:

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::*&)())

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

使用成员函数

QtConcurrent::run()也接受指向成员函数的指针。第一个实参必须是const引用或指向类实例的指针。在调用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 );