Создание экземпляра shared ptr с помощью make shared



Рассмотрим следующий код:

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. Однако компилятор выдает мне ошибку "недопустимая инициализация ссылки типа ... из выражения типа "неразрешенный перегруженный тип функции" ". Очевидно, я делаю что-то глупое, но я не могу понять, что именно. Кто-нибудь может помочь? Заранее спасибо!

192   3  

3 ответов:

Step() является нестатической функцией-членом, поэтому она имеет неявный первый параметр типа A*. Вам нужно привязать текущий экземпляр A при его вызове.

mThread = std::make_shared<std::thread>(std::bind(&A::Step, this));

Вы также можете использовать лямбду вместо bind

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

Как указывает @Casey в комментариях, std::thread'конструктор s имеет специальную обработку для указателя на функции-члены и будет предполагать, что первый следующий аргумент является указателем или ссылкой на экземпляр, на котором вызывается функция-член. Это означает, что вы можете избежать bind и непосредственно передать this в качестве второго аргумента.

mThread = std::make_shared<std::thread>(&A::Step, this);

Попробуйте (используйте labda вместо свободной функции):

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

Таким образом, вы не передаете ссылку на это конструктору, несмотря на то, что это функция-член.

Это решение использует лямбду для создания объекта-функции, который не принимает параметров, но имеет ссылку на это.

Если вы хотите использовать глобальную функцию, сделайте это вместо этого и переместите void Step() в before it's usage:

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

:: устраняет неоднозначность в области действия функции.

Вы должны использовать shared_from_this() заменить это

    Ничего не найдено.

Добавить ответ:
Отменить.