2013-06-04 11 views
5

Ich bekomme einen Kompilierfehler beim Übergeben einer Funktion mit 6 Parametern oder mehr an QtConcurrent::run(). Wenn ich sie auf 5 Parameter reduziere, bekomme ich diesen Fehler nicht mehr.QtConcurrent :: run() kann nicht mehr als 5 Argumente behandeln?

Dieser Dummy-Code reproduziert den Fehler für mich:

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

} 

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

Der Compiler Fehler ist:

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

Soll das so sein? Ist QtConcurrent::run() wirklich maximal auf 5 Argumente beschränkt?

+2

Es würde mich nicht überraschen, wenn es begrenzt wäre. Es muss schließlich mit Pre-C++ 11-Compilern arbeiten. – Angew

Antwort

8

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

Es gibt 5 Argumente, die Funktion

6

Auf der einen Seite nehmen können, können Sie std::bind oder boost::bind mehr als 5 Argumente zu übergeben (unbegrenzt bei von C++ 11):

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

Auf der anderen Seite, 5 Argumente Shou ld sein genug für jede Funktion. Vielleicht möchten Sie Ihr Design überdenken, um die Anzahl der Funktionsparameter zu verringern. Sie können stattdessen ein Objekt zur Funktion übergeben.

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

Vergessen Sie auch nicht, dass die gleichzeitig :: run kann hung manchmal ohne Grund in pre-5.3 aufbaut.