Consider the following code:
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()
{
...
}
I'm trying to initialise the shared pointer mThread so that it calls the function Step. However, the compiler gives me the error "invalid initialization of reference of type ... from expression of type 'unresolved overloaded function type'". Obviously I'm doing something stupid, but I can't put my finger on it. Can anybody help? Thanks in advance!
Step()
is a non-static member function, so it has an implicit first parameter of type A*
. You need to bind the current instance of A
when invoking it.
mThread = std::make_shared<std::thread>(std::bind(&A::Step, this));
You can also use a lambda instead of bind
mThread = std::make_shared<std::thread>([this]{ Step(); });
As @Casey points out in the comments, std::thread
's constructor has special treatment for pointer to member functions, and will assume the first following argument is a pointer or reference to the instance on which to call the member function. This means you can avoid bind
and directly pass this
as the second argument.
mThread = std::make_shared<std::thread>(&A::Step, this);
Try (use labda instead of the free function):
mThread=make_shared<std::thread>([this](){ Step(); });
The way it is, you're not passing a reference to this to the constructor inspite of it being a member function.
This solution uses a lambda to create a function-object that takes no parameters but has a reference to this.
If you want to use the global function do this instead, and move void Step()
to before it's usage:
mThread=make_shared<std::thread>(::Step());
the ::
removes the ambiguity over the scope of the function.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With