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()
{
    ...
}

関数Stepを呼び出すように、共有ポインターmThreadを初期化しようとしています。ただし、コンパイラは「型の参照の初期化が無効です...型「未解決のオーバーロードされた関数型」の式から」というエラーを出します。明らかに私は何かばかげたことをしていますが、指を置くことはできません。誰でも助けることができますか?前もって感謝します!

4

3 に答える 3

7

Step()は非静的メンバー関数であるため、 type の暗黙的な最初のパラメーターがあります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のコンストラクターはメンバー関数へのポインターに対して特別な処理を行い、次の最初の引数がメンバー関数を呼び出すインスタンスへのポインターまたは参照であると想定します。これは、2 番目の引数として回避bindして直接渡すことができることを意味します。this

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

試してください (free 関数の代わりに labda を使用してください):

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

そのままでは、メンバー関数であるにもかかわらず、 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 に答える