Question

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!

Was it helpful?

Solution

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);

OTHER TIPS

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.

You should use shared_from_this() replace this

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top