如何获取在QtConcurrent中使用的非静态成员函数的地址
How to take address of non-static member function to use within QtConcurrent?
我试图在另一个线程中运行非静态成员函数。如果我输入:
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 );
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在C++中使用非静态成员函数作为回调函数
- (C++)为什么静态成员可以在初始化之前使用
- 类的全局对象和静态成员
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 模板化类中静态成员的延迟初始化
- 使用静态成员声明类时遇到问题
- C++:是否可以使用非静态成员变量模板?
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 如何在复杂继承中访问静态成员变量
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- C++构造函数和静态成员
- C++ - 非静态 void* 成员,指向具有相同地址但不同值的不同对象的另一个非静态成员
- 为什么有一个额外的 & 将非静态成员函数的地址传递给 C++ 中的线程?
- 错误:ISO C 禁止采用不合格或括号的非静态成员函数的地址,以形成指向成员函数的指针
- 为什么不允许非静态成员的地址作为模板非类型参数
- 类中静态成员的地址
- 获取静态成员的地址
- 如何获取在QtConcurrent中使用的非静态成员函数的地址