Matthias Hoffrichter wrote: > Hi, > > I want to encapsulate boost::find in a template method in a base > class for easier use. > Here is some code: > > #include <boost/function.hpp> > #include <boost/bind.hpp> > > class CWindow { > public: > CWindow() { > SetEventHandler(&CWindow::OnCreate); // this call works > } > long OnCreate() { > return 0; > } > template<typename T> void SetEventHandler(long (T::*Function)()) { > boost::function<long> EventFunction = boost::bind(Function, this); > // ... > // Add EventFunction into a std::map > } > }; > > class CButton : public CWindow { > public: > CButton() { > SetEventHandler(&CButton::OnPaint); // this call doesn't compile > } > long OnPaint() { > return 0; > } > };
In CWindow::SetEventHandler<CButton>, 'this' is a CWindow*. You can't invoke CButton::OnPaint using a pointer to CWindow. The easiest solution is probably to make SetEventHandler a free function: template<class F, class T> void setEventHandler(F f, T * p) { boost::function<long> EventFunction = boost::bind(f, p); // ... // Add EventFunction into a std::map } and then simply use setEventHandler(&CButton::OnPaint, this) in CButton::CButton(). You'll soon find that this is not _that_ easier to use compared to setEventHandler(bind(&CButton::OnPaint, this)); and the latter is much more flexible: setEventHandler(bind(&CButton::OnMessage, this, WM_PAINT)); but that's another story. :-) _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost