I am trying to call a member function of an object using a thread.
If the function does not have a variational pattern (Args ... args), there is no problem, it works:
Consider two classes:
GeneticEngine
template <class T> class GeneticEngine { template <typename ... Args> T* run_while(bool (*f)(const T&),const int size_enf,Args& ... args) { std::thread(&GeneticThread<T>::func,islands[0],f,size_enf); return } private: GeneticThread<T>** islands; }
GeneticThread
template <class T> class GeneticThread { void func(bool (*f)(const T&),const int size_enf) { }; }
This is normal.
Now I am adding a variation pattern to the same functions:
GeneticEngine
template <class T> class GeneticEngine { template <typename ... Args> T* run_while(bool (*f)(const T&,Args& ...),const int size_enf,Args& ... args) { std::thread(&GeneticThread<T>::func,islands[0],f,size_enf,args ...); } private: GeneticThread<T>** islands; }
GeneticThread
template <class T> class GeneticThread { template <typename ... Args> void func(bool (*f)(const T&,Args& ...), const int size_enf, Args& ... args) { }; }
GCC does not compile with this code: (sorry for this error message)
g++ main.cpp GeneticEngine.hpp GeneticThread.hpp Individu.hpp GeneticThread.o -g -std=c++0x -o main.exe In file included from main.cpp:2:0: GeneticEngine.hpp: In instantiation of 'T* GeneticEngine<T>::run_while(bool (*)(const T&, Args& ...), int, Args& ...) [with Args = {}; T = Individu]': main.cpp:24:78: required from here GeneticEngine.hpp:20:13: erreur: no matching function for call to 'std::thread::thread(<unresolved overloaded function type>, GeneticThread<Individu>*&, bool (*&)(const Individu&), const int&)' GeneticEngine.hpp:20:13: note: candidates are: In file included from GeneticThread.hpp:14:0, from GeneticEngine.hpp:4, from main.cpp:2: /usr/include/c++/4.7/thread:131:7: note: template<class _Callable, class ... _Args> std::thread::thread(_Callable&&, _Args&& ...) /usr/include/c++/4.7/thread:131:7: note: template argument deduction/substitution failed: In file included from main.cpp:2:0: GeneticEngine.hpp:20:13: note: couldn't deduce template parameter '_Callable' In file included from GeneticThread.hpp:14:0, from GeneticEngine.hpp:4, from main.cpp:2: /usr/include/c++/4.7/thread:126:5: note: std::thread::thread(std::thread&&) /usr/include/c++/4.7/thread:126:5: note: candidate expects 1 argument, 4 provided /usr/include/c++/4.7/thread:122:5: note: std::thread::thread() /usr/include/c++/4.7/thread:122:5: note: candidate expects 0 arguments, 4 provided
I really don't understand why this difference makes this mistake. And I canβt fix it.
In both, main.cpp looks like this:
int pop_size = 1000; int pop_child = pop_size*0.75; GeneticEngine<Individu> engine(); bool (*stop)(const Individu&) = [](const Individu& best){ return false; }; Individu* best = engine.run_while(stop,pop_child);
I use: "gcc version 4.7.2 (Ubuntu / Linaro 4.7.2-2ubuntu1)"
I tried:
std::thread(&GeneticThread<T>::func<Args...>, islands[0], f, size_enf, args ...);
Now I have one more error:
GeneticEngine.hpp: In member function 'T* GeneticEngine<T>::run_while(bool (*)(const T&, Args& ...), int, Args& ...)': GeneticEngine.hpp:20:53: erreur: expansion pattern '((& GeneticThread<T>::func) < <expression error>)' contains no argument packs GeneticEngine.hpp:20:24: erreur: expected primary-expression before '(' token GeneticEngine.hpp:20:53: erreur: expected primary-expression before '...' token template <typename ... Args> T* run_while(bool (*f)(const T&,Args& ...), const int size_enf, Args& ... args) { void (GeneticThread<T>::*ptm)(bool (*)(T const&, Args&...), int, Args&...) = &GeneticThread<T>::func; std::thread(ptm, islands[0], f, size_enf, args ...); }