C++ 错误:在将std::thread与接收指针的函数一起使用时,必须调用对非静态成员函数的引用

C++ 错误:在将std::thread与接收指针的函数一起使用时,必须调用对非静态成员函数的引用,c++,multithreading,sdl-2,C++,Multithreading,Sdl 2,我只是想在我的程序中执行一些多线程,我的一个函数叫做Setup,它的名字是这样的:Setup(renderer)并声明为无效设置(SDL_渲染器*渲染器)但是当我尝试让线程运行函数时,我得到一个错误:错误:必须在以下行调用对非静态成员函数的引用:std::thread th1(设置,渲染器)。如何让另一个线程运行该程序的功能?似乎安装程序是一个成员函数。如果是这样,调用它的一种简单方法是将lambda传递给std::thread: std::thread th1([this, renderer]

我只是想在我的程序中执行一些多线程,我的一个函数叫做
Setup
,它的名字是这样的:
Setup(renderer)并声明为
无效设置(SDL_渲染器*渲染器)但是当我尝试让线程运行函数时,我得到一个错误:
错误:必须在以下行调用对非静态成员函数的引用:
std::thread th1(设置,渲染器)。如何让另一个线程运行该程序的功能?

似乎安装程序是一个成员函数。如果是这样,调用它的一种简单方法是将lambda传递给
std::thread

std::thread th1([this, renderer](){ this->Setup(renderer); });
当调用成员函数时,编译器需要知道在哪个对象上调用函数。如果只执行
std::thread(Setup,renderer)
,编译器无法知道要在哪个对象实例上调用Setup函数

您需要以某种方式将该实例传递给线程——如我所示,使用lambda是一种方法
仅当您试图使用Setup函数在对象的成员函数中构造线程时有效。如果没有,下面是一个稍微不同的示例:

// You have some class with a Setup function...
class A { public: void Setup(SDL_Renderer* renderer); };

// You have an instance of that class:
A a_instance;

// You have the argument to the function
SDL_Renderer* renderer = /**/;

// You want to create a thread that runs A::setup on a_instance
std::thread th1([a = &a_instance, renderer]()
{
    a->Setup(renderer);
});

好的,有几件事。
这是什么
在示例中,它是类的名称吗?函数
Setup
的类和声明不是静态的,我不确定这些信息是否有用。另一件事是它给了我另一个奇怪的错误:
对符号“pthread\u create@@GLIBC\u 2.2.5”的未定义引用
当您在非静态成员函数(类中的函数)中时,
始终引用调用函数的对象。线程是在对象的某个实例上调用的某个函数的内部创建的-
就是该实例。我们将
这个
传递到lambda中,这样线程就可以调用相应对象上的
设置
函数。对于未定义的引用-您可能需要链接到pthread。如果我也在属于同一类的函数中执行多线程处理,这会正常工作吗?好的,它已编译,但现在我的代码显示一个黑色矩形,而不是一些文本?听起来像是您必须解决的另一个问题。如果多线程在属于同一类的函数中,那么Yes将或可以工作。