这个问题似乎已经在SO上得到了回答,但是尽管考虑了其他解决方案,但我仍然无法弄清楚为什么会出现此错误:
我有一个Runner
类,它将负责安排任务以异步方式在单独的线程上运行任何子工作。
在我的跑步者的start
方法中,我有以下代码:
void start(const bool runTaskAsync = true)
{
if(!isRunning()) return;
running = true;
if(runTaskAsync)
{
Worker = std::thread(runTask, this);
}
else
{
this->runTask();
}
}
编译器不喜欢的麻烦行是:
Worker = std::thread(runTask, this);
。基于给出的错误(以及本网站上提出的其他问题,我尝试执行以下操作)Worker = std::thread(&Runner::runTask);
但是我仍然遇到相同的错误。
runTask
方法是Runner
类的私有(private)方法,定义为:void runTask()
{
while(isRunning())
{
// this_thread refers to the thread which created the timer
std::this_thread::sleep_for(interval);
if(isRunning())
{
// Function is a public method that we need to call, uses double parens because first calls the function called Function
// and then the second set of parens calls the function that the calling Function returns
Function()();
}
}
}
对
Function()()
的调用将调用传递给Runner
实例的模板函数,将task
的Runners私有(private)成员变量签名为std::function<void(void)> task;
,并将Function()()
的实现签名为:const std::function<void(void)> &Function() const
{
return task;
}
哪个被调用(据我所知)将运行
Function()
,然后运行task()
如果需要其他详细信息,请告诉我。我目前没有实例化
Runner
的任何实例,我只是在自己的Runner.h
文件中包括了main.cpp
以查看其是否可以编译。 最佳答案
应该是:
Worker = std::thread(&Runner::runTask, this);
每个非静态成员函数都采用一个隐式
this
,当您想要将该成员函数传递给std::thread
时,该隐式公开(并且是必需的)关于c++ - C++函数调用缺少参数列表;使用 '&Runner::runTask'创建一个指向成员的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39821922/