代码如下:
#include <iostream>
#include <thread>
struct PickRandomFile {
PickRandomFile() {
std::thread t1(taskScanPaths);
}
inline void taskScanPaths() {
// my task
}
};
int main() {
PickRandomFile pickRandomFile;
return 0;
}
msvc
说 PickRandomFile :: taskScanPaths':非标准语法;使用“&”创建指向成员ThreadTrigger的指针
怎么了?我通常是在gcc
中完成的。
答案 0 :(得分:3)
自由函数“衰减到指针”(类似于数组),所以
std::thread t1(taskScanPaths);
如果taskScanPaths
是一个自由函数,那会没事的,它的作用与
std::thread t1(&taskScanPaths);
但是,对于类成员函数,您需要使用地址来获取指向成员函数的指针(并且需要指定类),如
std::thread t1(&PickRandomFile::taskScanPaths,this);
还请注意,您需要将对象/指针传递给实例,以便线程可以实际调用该方法。
来自cppreference的一些相关引号:
指向成员函数的指针
指向非静态成员函数f的指针,该成员函数f是类C的成员 可以完全使用表达式&C :: f进行初始化。这样的表达 因为C的成员函数中的&&(C :: f)或&f不构成指向的指针 成员函数。
它没有明确提及f
,但是由于&f
没有形成指向成员函数的指针,因此可以肯定地假设f
也没有形成指向成员函数的指针
另一方面:
功能指针
指向函数的指针可以用a的地址初始化 非成员函数或静态成员函数。 由于 函数到指针的隐式转换,运算符的地址为 可选: