C ++函数调用缺少参数列表;使用'& Runner :: runTask'创建指向成员

时间:2016-10-02 21:34:00

标签: c++ c++11

这个问题似乎已经在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以查看它是否会编译。

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

Worker = std::thread(&Runner::runTask, this);

答案 1 :(得分:1)

  

根据给出的错误(以及本网站提出的其他问题,   我试图做以下事情)

Worker = std::thread(&Runner::runTask);

应该是:

 Worker = std::thread(&Runner::runTask, this);

每个非静态成员函数都采用隐式this,当您要将该成员函数传递给std::thread

时,它会被公开(并且是必需的)