这个问题似乎已经在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/

10-11 21:49