2017-07-02 3 views
0

Ich habe 3 Dateien: future.cpp, future.hpp und main.cpp. Ich habe eine Zukunft Klasse in .hpp erklärte wie folgt:Fehler beim Übergeben einer Referenz des Vektors in einem Thread an die Elementfunktion eines Objekts

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(); 

}; 

Ich habe Probleme in der Leere get_function_results (std :: vector &) -Funktion. Seine Umsetzung ist wie in der CPP folgt:

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()); 
}); 
} 

Diese Funktion aus dem main.cpp aufgerufen wird wie bei obj ist das Objekt folgt:

`

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

Ich habe einen Vektor im Wesentlichen muss das in dieser Funktion von der Zukunft get() gefüllt werden. Da zukünftiger get() - Code blockiert wird, wollte ich ihn in einem Thread starten, damit mein main so lange weitermachen kann, bis dieses Ergebnis aktualisiert wird, anstatt zu blockieren. Es funktionierte perfekt, als ich einen Vektor früher von dieser Funktion zurückgab. Aber es scheitert jetzt an einem Thread mit bestandener Referenz.

Die Fehler, die ich habe, sind:

`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)...); }` 

und diese:

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

ich viele Dinge ausprobiert, aber ich bin nicht in der Lage zu Figur, was falsch ist. Jede Hilfe wird geschätzt!

Antwort

0

Leider haben Sie keinen Kontext für den Aufruf von std :: thread constructor angegeben, daher weiß ich nicht, welcher Typ obj und result sind. Ich nehme an, dass obj von future_multithread Typ und result von std::vector<int> ist. In diesem Fall besteht der Fehler darin, dass Sie den Zeiger anstelle einer Referenz an den Vektor übergeben: Sie sollten &result in result ändern.

+0

Ich habe versucht, das zu tun. Es hat nicht funktioniert. Sie haben Recht, wenn der Typ von obj future_multithread ist und das Ergebnis der Vektor ist. Ich habe das Ergebnis von & in mein main geändert. Ich habe verschiedene Fehler: 'Fehler: kein Typ namens 'type' in 'Klasse std :: result_of &)> (future_multithread **, Std: : vector )> ' typedef typenname result_of <_Callable (_Args ...)> :: typ result_type; ' – KMG

+0

Dieser Ort scheint verdächtig zu sein:" future_multithr ad ** ". Anstelle des Zeigers gibt es Zeiger auf einen Zeiger. Könnten Sie bitte einen Teil des Codes teilen, der kompiliert werden sollte? Dies würde viel helfen –

Verwandte Themen