2017-07-02 13 views
0

future.cpp、future.hpp、およびmain.cppの3つのファイルがあります。次のように私は.HPPで宣言された将来のクラスを持っている:スレッドのベクトルの参照をオブジェクトのメンバ関数に渡す際のエラー

class future_multithread{ 

private: 
std::vector<std::vector<int>>my_input_list; 
int number_of_cores; 
int (*arbitrary_function)(std::vector<int>&); 
std::vector<std::thread> thread_track; 
std::vector<std::future<int>> futr; 
semaphore* sem; 

void control_threads(std::vector<int>&, std::promise<int>&&); 
void launch_threads(); 

public: 
future_multithread(int, std::vector<std::vector<int>>, int 
(*given_function)(std::vector<int>&)); 
void print(); 
void get_function_results(std::vector<int>&); 
~future_multithread(); 

}; 

私は、ボイドget_function_results(のstd ::ベクトル&)機能に問題が生じています。 .cppファイルに次のようにその実装は次のとおりです。

void future_multithread::get_function_results(std::vector<int>& results){ 
launch_threads(); 
for_each(futr.begin(), futr.end(), [this, &results](std::future<int>& ft){ 
results.push_back(ft.get()); 
}); 
} 

この関数はobjが対象となると、次のようにmain.cppにから呼び出されます。

`

auto th = std::thread(&future_multithread::get_function_results, &obj, &result); 
th.join();` 

私はベクトルを持っていますこの関数で将来のget()で満たされる必要があるメインでは、将来のget()コードがブロックされているので、ブロックではなく、この結果が更新されるまで私のメインが実行できるようにスレッドで起動したいと思っていました。この関数から早くベクトルを返すときは、完全に動作していました。しかし、現在は、渡された参照を持つスレッドで失敗しています。私が得た

エラーは以下のとおりです。

`error: cannot apply member pointer ‘((const std::_Mem_fn_base<void (future_multithread::*)(std::vector<int>&), true>*)this)->std::_Mem_fn_base<void (future_multithread::*)(std::vector<int>&), true>::_M_pmf’ to ‘* __ptr’, which is of non-class type ‘future_multithread*’ 
    { return ((*__ptr).*_M_pmf)(std::forward<_Args>(__args)...); }` 

と、この:

error: return-statement with a value, in function returning 'void' [-fpermissive]{ return ((*__ptr).*_M_pmf)(std::forward<_Args>(__args)...); } 

私は多くのことを試してみましたが、私は間違っているものを把握することができません。どんな助けもありがとう!

答えて

0

残念ながら、std :: threadコンストラクタコールのコンテキストを指定していないため、タイプobjresultは分かりません。私は、objfuture_multithreadタイプであり、resultstd::vector<int>であると仮定します。この場合、エラーは参照の代わりにベクトルにポインタを渡していることです。&resultresultに変更する必要があります。

+0

私はそれをやってみました。うまく行かなかった。あなたはobjがfuture_multithreadであり、結果がベクトルであることについて正しいです。結果をメインに変更しました。私は別のエラーが発生しました: 'エラー:クラス 'std :: result_of & :)> ' typedef typename result_of <_Callable(_Args ...)> ::タイプresult_type; ' – KMG

+0

この場所は疑わしいと思われる:" future_multithre ad ** "ポインタの代わりにポインタへのポインタがあります。コンパイルするコードをいくつか共有してください。これはたくさんの助けになります –

関連する問題