c++ - Error converting void(__cdecl MyClass::*)() to void * -


i trying link external library in qt application. external library has header file following relevant code i'm trying call:

 extern vgrabdevice_api bool v_assignframesizecallback(igrabchannel* pchannel, void* pfunc); 

in demo c++ program provided, has no problems compiling, following relevant code is:

// in main.cpp     void _stdcall myframesizecallback(t x) {     do_stuff; }  int main(int argc, char* argv[]) {     igrabchannel* pchannel0 = something;     v_assignframesizecallback(pchannel0, myframesizecallback); } 

i trying incorporate code qt application, getting problems. in mainwindow.cpp file:

void _stdcall mainwindow::myframesizecallback(t x) {     do_stuff; }  void mainwindow::somefunction() {     igrabchannel* pchannel0 = something;     v_assignframesizecallback(pchannel0, &mainwindow::myframesizecallback); } 

the error i'm getting is:

error: c2664: 'bool v_assignframesizecallback(igrabchannel *,void *)' : cannot convert argument 2 'void (__cdecl mainwindow::* )(t)' 'void *' there no context in conversion possible 

what need do? thanks.

you have 2 problems. first, void* data pointer, not function pointer. according c++ standard, casting between 2 not expected work. platforms provide stronger guarantee... example windows getprocaddress , *nix dlsym mix two.

next, &mainwindow::myframesizecallback not function pointer, pointer-to-member-function. calling requires mainwindow object, external library doesn't know about.

you need provide ordinary function, not member function, library. if have way ahold of mainwindow* object pointer, can call member function real work. library provides "context" parameter passed callback; that's great place put object pointer. otherwise, you'll need store mainwindow* in global variable. easy if have one, while if have more 1 might go std::map<igrabchannel*, mainwindow*>.

code:

mainwindow* mainwindow::the_window;  void mainwindow::myframesizecallback(t x) {     do_stuff; }  void _stdcall myframesizecallbackshim(t x) {     mainwindow::the_window->myframesizecallback(x); }  void mainwindow::somefunction() {     igrabchannel* pchannel0 = something;     the_window = this;     v_assignframesizecallback(pchannel0, &myframesizecallbackshim); } 

if parameter x isn't igrabchannel, change map datatype , insertion logic accordingly. if parameter x isn't sort of unique predictable identifier, may limited doing callbacks 1 mainwindow instance.


Comments

Popular posts from this blog

python - mat is not a numerical tuple : openCV error -

c# - MSAA finds controls UI Automation doesn't -

wordpress - .htaccess: RewriteRule: bad flag delimiters -