2016-07-04 10 views
-1

私はかなり単純な機能で作業しています:コンカレントfor入力要素のリスト、出力ベクトル、および出力を計算する関数入力要素からの要素。'std :: thread'の初期化のための一致するコンストラクタがありません

  template<class In, class Out> 
      void thread_do(net::coderodde::concurrent::queue<In>& input_queue, 
          Out (*process)(In in), 
          std::vector<Out>& output_vector) 
      { 
       // Pop the queue, process, and save result. 
       ... 
      } 


       for (unsigned i = 0; i < thread_count; ++i) 
       { 
        thread_vector.push_back(std::thread(thread_do, 
                 input_queue, 
                 process, 
                 output_vector)); 
       } 

は私が-std=c++14を使用します。

は私がコンパイルされません。このスニペットを持っています。

 

./concurrent.h:129:45: error: no matching constructor for initialization of 'std::thread' 
        thread_vector.push_back(std::thread(thread_do, 
              ^   ~~~~~~~~~~ 
 

しかし、私はそれを修正する方法はわかりません。 <In, Out>追加/ thread_do&を付加しようとしたん、まだを利用するために。

+1

thread_doは、テンプレート関数とクラスメソッドの両方です。 std :: threadのコンストラクタはそれを反映する必要があります。 –

+0

うわー、あまりにも多くのコード。今月までにあなたがデバッグしてきた[MCVE]はどこですか? –

+0

_ "これを修正する方法はわかりません。を追加してthread_doを追加してみましたが、まだ利用できません" _ドキュメントを読んでみることができます。推測する。 –

答えて

1

あなたはあなたの関数をインスタンス化する必要があります。

thread_vector.push_back(std::thread(thread_do<In, Out>,  // you need to instantiate your template function 
            std::ref(input_queue), // pass parameters by ref 
            std::ref(process),  // - // - 
            std::ref(output_vector))// - // - 
            ); 
4

この最小限の完全な例(ヒント)は、別のスレッドでテンプレートメンバー関数を呼び出す方法を示しています。

#include <thread> 

struct X 
{ 

    template<class A, class B> void run(A a, B b) 
    { 
    } 

    template<class A, class B> 
    void run_with(A a, B b) 
    { 
    mythread = std::thread(&X::run<A, B>, this, a, b); 
    } 

    std::thread mythread; 
}; 

int main() 
{ 
    X x; 
    x.run_with(10, 12); 
    x.mythread.join(); 
} 

std::threadのコンストラクタは自動を推論テンプレート引数にできないことに注意してください。あなたは明白でなければなりません。

関連する問題