2013-06-04 8 views
5

Viene visualizzato un errore di compilazione quando si passa una funzione con 6 parametri o più a QtConcurrent::run(). Quando li riduco a 5 parametri, non ricevo più questo errore.QtConcurrent :: run() non può gestire più di 5 argomenti?

Questo codice fittizio riproduce l'errore per me:

void foo(int, int, int, int, int, int) 
{ 

} 

QtConcurrent::run(foo, 1, 2, 3, 4, 5, 6); 

L'errore del compilatore è:

error: no matching function for call to 'run(void (&)(int, int, int, int, int, int), int, int, int, int, int, int)' 

è questo dovrebbe essere così? QtConcurrent::run() è veramente limitato a 5 argomenti al massimo?

+2

Non mi sorprenderebbe se fosse limitato. Dopotutto, deve lavorare con i compilatori pre-C++ 11. – Angew

risposta

8

Vedi qtconcurrentrun.h

template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5> 
QFuture<T> run(T (*functionPointer)(Param1, Param2, Param3, Param4, Param5), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5); 

Ci sono 5 argomenti che la funzione può assumere

6

Da un lato, è possibile utilizzare std::bind o boost::bind di passare più di 5 argomenti (illimitata in caso di C++ 11):

QFuture<void> result = QtConcurrent::run(std::bind(&foo, 1, 2, 3, 4, 5, 6)); 

Sull'altro lato, 5 argomenti shou Devo essere abbastanza per ogni funzione. Potresti voler riconsiderare il tuo progetto per ridurre il numero di parametri di funzione. È possibile passare invece qualche oggetto per funzionare.

Data d; 
QFuture<void> result = QtConcurrent::run(foo, d); 

Inoltre, non dimenticare che Concurrent :: run può hung a volte senza motivo in pre-5.3 build.