请考虑以下代码:
class A
{
....
shared_ptr<std::thread> mThread;
void Step();
void LaunchTrhead();
}
void A::LaunchThread()
{
...
mThread=make_shared<std::thread>(Step); // This line gives an error
...
}
void A::Step()
{
...
}
我正在尝试初始化共享指针 mThread ,以便它调用函数 Step 。但是,编译器给出了错误“类型的引用的无效初始化...来自类型'未解析的重载函数类型'的表达式”。显然我做了一些愚蠢的事,但我不能把手指放在上面。有人可以帮忙吗?提前谢谢!
答案 0 :(得分:6)
Step()
是一个非静态成员函数,因此它具有类型为A*
的隐式第一个参数。您需要在调用它时绑定A
的当前实例。
mThread = std::make_shared<std::thread>(std::bind(&A::Step, this));
您也可以使用lambda而不是bind
mThread = std::make_shared<std::thread>([this]{ Step(); });
正如@Casey在注释中指出的那样,std::thread
's constructor对指向成员函数的指针有特殊处理,并假设第一个以下参数是指向要调用成员函数的实例的指针或引用。这意味着您可以避免bind
并直接将this
作为第二个参数传递。
mThread = std::make_shared<std::thread>(&A::Step, this);
答案 1 :(得分:1)
尝试(使用labda而不是自由函数):
mThread=make_shared<std::thread>([this](){ Step(); });
就这样,你不会将对它的引用传递给构造函数,尽管它是一个成员函数。
此解决方案使用lambda创建一个函数对象,该函数对象不带任何参数,但具有对此的引用。
如果您想使用全局函数,请执行此操作,并在使用前将void Step()
移至:
mThread=make_shared<std::thread>(::Step());
::
消除了函数范围的歧义。
答案 2 :(得分:0)
您应该使用shared_from_this()
替换此