2017-12-12 7 views
-1

現在、別のスレッドへの参照によってオブジェクトを渡そうとしていますが、ソリューションをビルドしようとするとエラーが発生します。C++スレッドを作成して参照でオブジェクトを渡す

void OrderServer(Orders& customerOrders) 
{ 
    Item tempItem; 
    customerOrders.add(tempItem); 
} 

int main() 
{ 
Orders customerOrders(); 
auto serverThread = std::thread(OrderServer, std::cref(customerOrders)); 
serverThread.detach(); 
return 0; 
} 

次のエラーです:

C:コミュニティ\ VCの\ツール\マイクロソフトのVisual Studio \ \プログラムファイル(x86の)\ 2017 \ MSVC \ 14.11.25503 \含める\ THR \ xthread( 240):エラーC2672: 'std :: invoke':一致するオーバーロードされた関数が見つかりませんでした 1> c:\プログラムファイル(x86)\ microsoftビジュアルスタジオ\ 2017 \コミュニティ\ vc \ tools \ msvc \ 14.11.25503 \ include \ (std :: tuple> &、std :: integer_sequence < _Ty、0,1)を実行します。 >) 'コンパイル中

+0

を使用することができます。 'std :: ref()'を渡すか、関数が 'const'パラメータ参照を受け入れるようにしてください。 – Galik

+0

あなたのスレッド関数は非const参照を受け付けます。しかし、 'std :: cref'でconst参照ラッパーを作成します。 – StoryTeller

答えて

2

Orders customerOrders();は、関数を宣言します。これは最も厄介な構文解析と呼ばれています。

あなたは、単にあなたが非定数パラメータ関数に `のstd :: cref`を渡しているOrders customerOrders;

+0

素晴らしい人、それはそれを解決した –

+0

しかし、あなたはまだUBを持っています –

+0

私はこれに新しいです、ごめんなさい、UBは何を意味するのですか? –

0

あなたは、単に試みることができる:

auto serverThread = std::thread(OrderServer, customerOrders); 

(およびcustomerOrdersを宣言するときにタイプミスがありtold by François Moisanように)。

std::crefなし。ただし、スレッドは後でデタッチされますが、mainの返信によってcustomerOrdersが破棄されます。それはおそらくundefined behaviorです。OrderServerは、もう存在しないオブジェクトへの参照で動作します。

+0

crefを削除するとビルドエラーが発生する –

+1

コンパイラを信頼し、すべての警告を有効にし、警告を受け取らないようにコードを修正する習慣を取る必要があります。それは非常に簡単なはずです。 –

関連する問題