Pointer auf Member-Funktion und Templates (und ein aelterer Compiler?)
-
Hi, ich hab ein kleines Problem mit folgendem:
Ich moechte einer Funktion (dem Ctor eines boost::thread, um genau zu sein) eine Memberfunktion als Callback mitgeben. Sowohl die Memberfunktion als auch die die Klasse an sich sind Templates.
Nach viel rumprobieren hat folgendes Construct als funktionierend Herausgestellt:
template<class T> class SynchronizedQueue { public: template<class ExecuteFunction> void process(unsigned n_threads, ExecuteFunction func) { boost::ptr_vector<boost::thread> threads; boost::function<void ()> f; f = boost::bind(&SynchronizedQueue<T>::run<ExecuteFunction>, this, func); <--- Zeile 41 for (unsigned i = 0; i < n_threads; ++i) threads.push_back(new boost::thread(f)); foreach (boost::thread& t, threads) t.join(); } template<class ExecuteFunction> void run(ExecuteFunction& func) { /* ... */ } };Soweit so gut, mein Compiler daheim (GCC 4.4.1) schluckt das, ich war gluecklich. Leider muss der Code auf einer anderen Maschine kompiliert und ausgefuehrt werden, die nur den GCC 4.1.0 oben hat. Dieser meckert:
ynchronizedQueue.h: In member function 'void SynchronizedQueue<T>::process(unsigned int, ExecuteFunction)': SynchronizedQueue.h:41: error: expected primary-expression before '>' token SynchronizedQueue.h:41: error: expected primary-expression before ',' tokenLeider hab ich keinen Einfluss auf den Compiler auf der Maschine, der Code muss damit kompiliert werden(also bitte keine Vorschlaege der Art "installier doch 'ne neuere Compilerversion"). Wie kann ich den Code umschreiben, so dass er auch auf dem GCC 4.1 rennt?
-
es fehlt mal wieder template:
f = boost::bind(&SynchronizedQueue<T>::template run<ExecuteFunction>, this, func);run ist ein abhängiger Name und ohne Kenntnis von T könnte das auch z.B. ein Objekt sein, das folgende < dann der ganz normale kleiner-als-Operator.
Ich bin etwas überrascht, dass der gcc 4.4.1 das schlucken soll.
-
Thanks a lot
