2016-05-18 14 views
0

私はオンラインで見つかったこの例を実行する際にいくつか問題があります。C++スレッドとプロミス:削除された関数を参照しようとしています

void asyncFun(std::promise<int> intPromise) { 
    int result=5; 
    try { 
     // calculate the result 
     intPromise.set_value(result); 
    } 
    catch (...) { 
     intPromise.set_exception(std::current_exception()); 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) { 
    std::promise<int> intPromise; 
    std::future<int> intFuture = intPromise.get_future(); 
    std::thread t(asyncFun, std::move(intPromise)); 
    std::cout << "Main thread" << std::endl; 
    int result = intFuture.get(); // may throw MyException 
    std::cout << result<<std::endl; 
    return 0; 
} 

と私は取得しています:

エラーC2280: 'STD ::約束::約束(のconst のstd ::約束&)':削除 関数cを参照しようとします: \プログラムファイル(x86の)\のMicrosoft Visualスタジオ 12.0 \ VCの\は\、機能1149年1 tryFuture

+0

これはバグですか、使用しているVSのバージョンは? – Niall

+0

VS 2013を使用しています。今すぐインストールしています。2015 –

+0

[OK]をクリックします。しかし、別の回避策も 'shared_ptr'を使用しています。 – Niall

答えて

2

これは、使用している実装のバグであります。可能であれば、アップグレードを検討してください。

std::threadへの引数は、MoveConstructibleである必要があります。std::promiseは、これらの要件を満たしています。

オンラインでhttp://webcompiler.cloudapp.netでコンパイルされ、実行されます(t.join()mainに追加されています)。回避策として、リファレンス(「std::ref」を使用し、promiseから移動する)を「フィード」することを検討できますが、そのような回避策を使用して参照がつぶれていることを警告してください。

std::shared_ptrには、std::promiseを引数として使用します。

void asyncFun(std::shared_ptr<std::promise<int>> intPromise) { 
    int result=5; 
    try { 
     // calculate the result 
     intPromise->set_value(result); 
    } 
    catch (...) { 
     intPromise->set_exception(std::current_exception()); 
    } 
} 

int main() { 
    std::promise<int> intPromise; 
    std::future<int> intFuture = intPromise.get_future(); 
    auto sh = std::make_shared<std::promise<int>>(std::move(intPromise)); 
    std::thread t(asyncFun, sh); 
    std::cout << "Main thread" << std::endl; 
    int result = intFuture.get(); // may throw MyException 
    std::cout << result<<std::endl; 
    t.join(); 
    return 0; 
} 
+0

あなたが正しいです、私が上に投稿したコードは例です、私のコードはループを持っていますので、私は参照を使用できません。そうでなければ、私はループから外に出るときにそれらを失うでしょう。 –

+0

問題なし、shared_ptrそれに代わるものが助けになるだろう。 – Niall

+0

ありがとう:D最後にそれはVS 2015で働いた –

関連する問題