Создание экземпляра 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. Однако компилятор выдает мне ошибку "недопустимая инициализация ссылки типа ... из выражения типа "неразрешенный перегруженный тип функции" ". Очевидно, я делаю что-то глупое, но я не могу понять, что именно. Кто-нибудь может помочь? Заранее спасибо!
3 ответов:
Step()является нестатической функцией-членом, поэтому она имеет неявный первый параметр типаA*. Вам нужно привязать текущий экземплярAпри его вызове.mThread = std::make_shared<std::thread>(std::bind(&A::Step, this));Вы также можете использовать лямбду вместо
bindmThread = 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());
::устраняет неоднозначность в области действия функции.
Comments