C++ Can';t启动C++;std::以可调用为参数的线程

C++ Can';t启动C++;std::以可调用为参数的线程,c++,multithreading,templates,C++,Multithreading,Templates,我希望在程序中设置以下类: 实现缓冲区的类。此缓冲区满时,将生成一个线程,该线程进行回调以处理如何处理满缓冲区 包含缓冲区对象的类。实现回调函数 我在生成运行回调的std::线程时遇到了一些问题。看起来我把它的参数弄错了,但我搞不清楚 最小可复制示例: #include <thread> class MyClass; class CallbackClass { public: void (MyClass::*callback)();

我希望在程序中设置以下类:

  • 实现缓冲区的类。此缓冲区满时,将生成一个线程,该线程进行回调以处理如何处理满缓冲区
  • 包含缓冲区对象的类。实现回调函数
我在生成运行回调的std::线程时遇到了一些问题。看起来我把它的参数弄错了,但我搞不清楚

最小可复制示例:

#include <thread>

class MyClass;

class CallbackClass
{
    public:

        void (MyClass::*callback)();
        std::thread a_thread;

        void setCallback(void (MyClass::*cb)())
        {
            callback = cb;
        }

        void writeCall()
        {
            a_thread = std::thread(callback); // error here
        }
};

class MyClass
{
    public:

        CallbackClass callbackobject;

        MyClass()
        {
            callbackobject.setCallback(&MyClass::bufferWriter);
        }

        void bufferWriter(){}
};

int main(){}
这是指向类方法的指针

a_thread = std::thread(callback);
类方法不是一个可以自己调用的函数。类方法需要为其调用的对象。您需要从某处存储或获取指向
MyClass
对象的指针。例如,您可以将第二个参数传递给`setCallback:

void setCallback(void (MyClass::*cb)(), MyClass *ptr)
然后把它藏在某个地方,然后用它来调用类方法。通常,这类似于:

a_thread = std::thread(callback, ptr);
这是指向类方法的指针

a_thread = std::thread(callback);
类方法不是一个可以自己调用的函数。类方法需要为其调用的对象。您需要从某处存储或获取指向
MyClass
对象的指针。例如,您可以将第二个参数传递给`setCallback:

void setCallback(void (MyClass::*cb)(), MyClass *ptr)
然后把它藏在某个地方,然后用它来调用类方法。通常,这类似于:

a_thread = std::thread(callback, ptr);

此错误是否附加到任何特定代码行?“回调”不是可调用对象。“回调”是一个类方法。您如何期望
std::thread
知道要调用哪个对象的回调方法?那是你的问题<代码>回调需要一个
对象,它将调用该对象的方法。我已经突出显示了一点,以供将来查看。无关:此代码生成大量警告。有些可能很重要,例如
“类基”具有虚拟函数和可访问的非虚拟析构函数。编译时,您应该打开更多警告,并尝试修复所有警告。我认为唯一的一点是,复制此问题不需要关键字
template
。此错误是否附加到任何特定代码行?“回调”不是可调用的对象。“回调”是一个类方法。您如何期望
std::thread
知道要调用哪个对象的回调方法?那是你的问题<代码>回调
需要一个
对象,它将调用该对象的方法。我已经突出显示了一点,以供将来查看。无关:此代码生成大量警告。有些可能很重要,例如
“类基”具有虚拟函数和可访问的非虚拟析构函数。编译时应该打开更多警告,并尝试修复所有警告。我认为唯一的一点是,复制此问题不需要关键字
template