1

Possible Duplicate:
How can I pass a class member function as a callback?

I have two classes A and B

class A
{
public:
   void SetHandler(void (*p)(OMX_BUFFERHEADERTYPE*)){ Handler = p; };
private:
  void (*Handler)(OMX_BUFFERHEADERTYPE*);
}

and

in B I have a function

void B::handler(OMX_BUFFERHEADERTYPE* p){};

now when (from B) I call

inst_a.SetHandler(&B::handler);

i get the following error:

B.cpp:740:69: error: no matching function for call to ‘A::SetHandler(void (COMXVideo::*)(OMX_BUFFERHEADERTYPE*))’
B.cpp:740:69: note: candidate is:
A.h:161:8: note: void A::SetHandler(void (*)(OMX_BUFFERHEADERTYPE*))
A.h:161:8: note:   no known conversion for argument 1 from ‘void (B::*)(OMX_BUFFERHEADERTYPE*)’ to ‘void (*)(OMX_BUFFERHEADERTYPE*)’

what am I doing wrong?

Best Regards

Community
  • 1
  • 1
Stasik
  • 2,430
  • 1
  • 23
  • 40
  • http://www.parashift.com/c++-faq/fnptr-vs-memfnptr-types.html – AnT Dec 26 '12 at 22:42
  • http://www.parashift.com/c++-faq/memfnptr-vs-fnptr.html – AnT Dec 26 '12 at 22:43
  • 1
    possible duplicate of [How can I pass a class member function as a callback?](http://stackoverflow.com/questions/400257/how-can-i-pass-a-class-member-function-as-a-callback), [Using a C++ class member function as a C callback function](http://stackoverflow.com/questions/1000663/using-a-c-class-member-function-as-a-c-callback-function), [C++ class member function callback](http://stackoverflow.com/questions/8079453/c-class-member-function-callback) – AnT Dec 26 '12 at 22:43

2 Answers2

3

&B::handler is not a function pointer, but a pointer to member function. If B::handler doesn't need members of B, you can define it static. Then SetHandler(&B::handler) will work.

If you must have a pointer to member function, you can define it as

void (B::*Handler)(OMX_BUFFERHEADERTYPE*);

when you call such a member function, you need a pointer to an object as well

(inst_b->*Handler)(omxbuffer);

or with a reference

(inst_b.*Handler)(omxbuffer);
Olaf Dietsche
  • 66,104
  • 6
  • 91
  • 177
0

try somthing like this:

template<typename C>
class EventObject
{

    public:
        typedef void (C::*FunctionType)();

        template <typename ... T>
        EventObject(C& obj,FunctionType methode): obj (obj), callback (methode) {};

       void execute(){obj.*callback();};

    private:
        C& obj;
        FunctionType callback;
};
Krozark
  • 852
  • 6
  • 27