2017-07-07 31 views
1

私のクラス/構造体にスレッドオブジェクトを作成したいが、宣言中にすぐに初期化したくない。 Inteadは後でそれをやりたいしたがって、以下のコードスニペットのように、このコンパイルエラーが発生しています。これをどうやって解決するのですか?エラーC2280 C++で初期化せずにstd :: threadを作成中

エラーC2280: 'のstd ::スレッド::スレッド(CONSTのstd ::スレッド&)':私はこのエラーを引き起こすラインを観察した削除機能

を参照する を試行することである。

std::thread t2; 

それは我々だけで初期化せずにはstd ::スレッドを宣言することができないことを意味するのでしょうか?これは、このスレッドで答えIs it possible to define an std::thread and initialize it later?

struct Abc 
{ 
    int a; 
    std::thread t2; 
    void mem1() 
    { 
     printf("mem1\n"); 
    } 

    void mem2() 
    { 
     printf("mem2\n"); 
     std::thread t1(&Abc::mem1, Abc()); 
     t2.swap(t1); 
     printf("after spawning t1\n"); 
     t2.join(); 
    } 
}; 

エラーの詳細を矛盾:

C:\プログラムファイル(x86の)\のMicrosoft Visual Studioの12.0 \ VC \は\ xmemory0(611)を含み:エラーC2280: 'std :: thread :: thread(const std :: thread &)':削除された関数を参照しようとしています1>
C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ include \ thread(70): 'stdの宣言を参照してください。 ::スレッド::スレッドは、ABC「1>この診断は、コンパイラが生成 機能で発生した」:: Abcの(定数Abcの&)

+0

このコードはokです。ここで動作します:https://ideone.com/xRjkcv。私はthik問題は別の場所です。あなたのプログラムの残りの部分を投稿するか、全体をクリーニング/リビルドしてみてください... –

答えて

4

は、コンパイラのエラーは、構造体をコピーしようとしていることを語っていますAbcのメンバーはstd::threadです。 std::threadはコピーできないため、これは不可能です。

最初に指し示すコード(つまり実際にAbcのコピーコンストラクタを呼び出すコード行)を含むエラーメッセージ全体を投稿した場合は、より完全な解決策を提供できます。


古い答えは以下に保たれているが、私はそれはあなたの特定の問題の原因を定義する際に間違いがあると思われ。コンパイラによって生成された移動コンストラクタに関する話は、それ自体ではまだ有効です。

コードは問題ありません。コンパイラはswapへの呼び出しをコンパイルすることに失敗しています。移動専用型の場合は、関係する型の移動コンストラクタに依存します。 std::threadに明示的に定義されていないので、この場合、準拠したコンパイラが生成します。

Visual Studio 2013は、自動的に移動コンストラクタを生成しません。これは、回避できるバグのようです(具体的にはstd::threadの実装と、おそらく他のすべてのstdクラス(テンプレート)を定義することによって)。コンパイラをVS 2013.5(アップデート5)に更新して、それが役立つかどうかを確認してください。

これで解決しない場合は、新しいバージョンのVisual Studioを入手してください。移動コンストラクタを生成しないという問題はVS 2015で修正されています。VS 2017も出ています。後者は、標準的なC++の場合にはまだまだ多くの "基本的な" SFINAEをコンパイルできないにもかかわらず、はるかに優れています。

+0

vs2013.5アップグレードでも同じ問題が発生しています。 VS2015またはVS2017にアップグレードしないという制約があります。また、私のコードは、OSにとらわれないものです。 C++標準で初期化せずにスレッドの宣言ができるのであれば、すべてのコンパイラがC++標準に準拠しているわけではありません。彼らはなぜ彼らのカスタマイズを持っていますか?ウィルは、この仕事は、freshmeat_linux/Linux]、マック、アンドロイド? – codeLover

+0

すべてのコンパイラが標準に準拠していないのはなぜですか?さて、ほとんどの場合、ほとんどの場合、VSの詳細(または大きな部分)の一部を忘れてしまうのが普通です。 VS 2013のC++ 11のサポートはあまり良くありません。 – rubenvb

+0

プログラミングと標準的な読書にあなたの熱意を活性化させるためには不思議なバグが必要です。 VSはいつもあなたのためにここにいます。 –

-6

別のコンストラクタを呼び出します。その行はデフォルトのコンストラクタを呼び出します。このコンストラクタはデフォルトでmoveコンストラクタを呼び出します。この問題の答えはかなり照明さ:

enter link description here

+0

はプロとして役立つ/役立つようにしてください。「笑」は役に立ちません。デフォルトのコンストラクタは、ムーブコンストラクタをデフォルトにしません。リンクのみの回答は怒られます。 – sehe

+0

次に、デフォルトのコンストラクタを呼び出したときに、そのエラーが発生するのはなぜですか?本気ですか? – user8210143

+0

コピーコンストラクタを呼び出します。これはデフォルトのコンストラクタではありません。また、コピーコンストラクタもムーブコンストラクタにデフォルトではなく、削除もされません。本当に他の答えを見てください。 – sehe

関連する問題