4

考虑以下代码:

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。但是,编译器给了我错误“类型的引用无效初始化......来自类型'未解析的重载函数类型'的表达式”。显然我在做一些愚蠢的事情,但我不能指望它。有人可以帮忙吗?提前致谢!

4

3 回答 3

7

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' 的构造函数对指向成员函数的指针有特殊处理,并假设后面的第一个参数是指向要调用成员函数的实例的指针或引用。这意味着您可以避免并直接作为第二个参数bind传递。this

mThread = std::make_shared<std::thread>(&A::Step, this);
于 2014-02-14T14:05:14.367 回答
1

尝试(使用 labda 而不是 free 函数):

mThread=make_shared<std::thread>([this](){ Step(); }); 

它的方式是,尽管它是一个成员函数,但您并没有将 this 的引用传递给构造函数。

此解决方案使用 lambda 创建一个函数对象,该函数对象不带参数,但具有对 this 的引用。

如果您想使用全局函数,请执行此操作,并void Step()在使用之前移至:

mThread=make_shared<std::thread>(::Step()); 

::消除了函数范围的歧义。

于 2014-02-14T13:59:08.917 回答
0

你应该使用shared_from_this()替换这个

于 2015-05-27T08:25:58.297 回答