这个问题似乎已经在SO上得到了解答,但是尽管看了其他解决方案,我仍然无法弄清楚为什么我会收到错误:
函数调用缺少参数列表;使用'& Runner :: runTask'创建指向成员的指针
我有一个类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
类的私有方法,定义为:
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私有成员变量签名为std::function<void(void)> task;
并执行{{1}签名为:
Function()()
调用后(据我所知)将运行const std::function<void(void)> &Function() const
{
return task;
}
,然后运行Function()
如果还有其他详细信息,请告知我们。我目前没有实例化task()
的任何实例,我只是在我的Runner
文件中包含Runner.h
以查看它是否会编译。
答案 0 :(得分:1)
这应该可以解决问题:
Worker = std::thread(&Runner::runTask, this);
答案 1 :(得分:1)
根据给出的错误(以及本网站提出的其他问题, 我试图做以下事情)
Worker = std::thread(&Runner::runTask);
应该是:
Worker = std::thread(&Runner::runTask, this);
每个非静态成员函数都采用隐式this
,当您要将该成员函数传递给std::thread