将void(__ cdecl MyClass :: *)()转换为void *时出错

用户名

我正在尝试链接到QT应用程序中的外部库。外部库有一个头文件,其中包含我要调用的以下相关代码:

 extern VGRABDEVICE_API bool V_AssignFrameSizeCallback(IGrabChannel* pChannel, void* pFunc);

在提供的演示C ++程序中,该程序没有编译问题,下面的相关代码是:

// in main.cpp    
void _stdcall MyFrameSizeCallback(T x) {
    do_stuff;
}

int main(int argc, char* argv[]) {
    IGrabChannel* pChannel0 = something;
    V_AssignFrameSizeCallback(pChannel0, MyFrameSizeCallback);
}

我正在尝试将此代码合并到我的QT应用程序中,但是遇到了问题。在我的mainwindow.cpp文件中:

void _stdcall MainWindow::MyFrameSizeCallback(T x) {
    do_stuff;
}

void MainWindow::someFunction() {
    IGrabChannel* pChannel0 = something;
    V_AssignFrameSizeCallback(pChannel0, &MainWindow::MyFrameSizeCallback);
}

我得到的错误是:

error: C2664: 'bool V_AssignFrameSizeCallback(IGrabChannel *,void *)' :
cannot convert argument 2 from 'void (__cdecl MainWindow::* )(T)' to 'void *'
There is no context in which this conversion is possible

我需要做什么?谢谢。

本·沃格特

你有两个问题。首先,void*是数据指针,而不是函数指针。根据C ++标准,预计两者之间的转换不起作用。某些平台提供了更强的保证...例如WindowsGetProcAddress和* nixdlsym混合使用两者。

其次,您&MainWindow::MyFrameSizeCallback不是函数指针,而是成员函数指针调用它需要一个MainWindow对象,外部库对此一无所知。

您需要向库提供一个普通函数,而不是成员函数。如果您有某种方法可以掌握MainWindow*对象指针,则可以调用其成员函数来完成实际工作。有时,库提供了一个“上下文”参数,该参数会传递给您的回调。那是放置对象指针的好地方。否则,您将需要将其存储MainWindow*在全局变量中。如果只有一个,则很容易;而如果有多个,则可以选择std::map<IGrabChannel*, MainWindow*>

代码:

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);
}

如果参数x不是IGrabChannel,则相应地更改map数据类型和插入逻辑。如果该参数x不是某种唯一的可预测标识符,则您可能会被限制为仅对一个MainWindow实例进行回调

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将void(__ cdecl MyClass :: *)()转换为void *时出错

来自分类Dev

无法将'void(MyClass :: *)()'转换为'void(*)()

来自分类Dev

如何将“ void(MyClass :: *)(int)”转换为“ void(*)(int)”?

来自分类Dev

将MyClass <TDescendent>转换为MyClass <TAncestor>

来自分类Dev

无法将“MyClass”转换为“MyClass”

来自分类Dev

使用new时,优点是将指针转换为void *

来自分类Dev

将std :: function <void()>转换为void(*)()

来自分类Dev

将 void (*)() 转换为 void (*)(unsigned char)

来自分类Dev

从'GLvoid(*)(){aka void(*)()}'到'void(__attribute __((__ cdecl__))*)(int)的无效转换

来自分类Dev

将int转换为void *

来自分类Dev

C:将void(*)(void *)转换为void(*)(char *)

来自分类Dev

尝试创建线程时从'void *(*)(int(*)[2])'无效转换为'void *(*)(void *)

来自分类Dev

将Collection <myClass>转换为Collection <String>

来自分类Dev

将参数传递给可变参数函数时,强制转换为void *有什么作用?

来自分类Dev

检查 int 是否在范围内时无法将 void 转换为 int

来自分类Dev

将地址转换为函数:使用“ void * void”

来自分类Dev

无法将void转换为java.lang.Void

来自分类Dev

将float转换为datetime时出错

来自分类Dev

将DICOM转换为JPEG时出错

来自分类Dev

将double转换为int时出错

来自分类Dev

将Object []转换为byte []时出错

来自分类Dev

将float转换为datatime时出错

来自分类Dev

将varchar转换为datetime时出错

来自分类Dev

将jpg转换为pdf时出错

来自分类Dev

将jpg转换为pdf时出错

来自分类Dev

将double转换为BigInteger时出错

来自分类Dev

将kml转换为geojson时出错

来自分类Dev

将int转换为NSNumber时出错

来自分类Dev

将mysql转换为mysqli时出错

Related 相关文章

  1. 1

    将void(__ cdecl MyClass :: *)()转换为void *时出错

  2. 2

    无法将'void(MyClass :: *)()'转换为'void(*)()

  3. 3

    如何将“ void(MyClass :: *)(int)”转换为“ void(*)(int)”?

  4. 4

    将MyClass <TDescendent>转换为MyClass <TAncestor>

  5. 5

    无法将“MyClass”转换为“MyClass”

  6. 6

    使用new时,优点是将指针转换为void *

  7. 7

    将std :: function <void()>转换为void(*)()

  8. 8

    将 void (*)() 转换为 void (*)(unsigned char)

  9. 9

    从'GLvoid(*)(){aka void(*)()}'到'void(__attribute __((__ cdecl__))*)(int)的无效转换

  10. 10

    将int转换为void *

  11. 11

    C:将void(*)(void *)转换为void(*)(char *)

  12. 12

    尝试创建线程时从'void *(*)(int(*)[2])'无效转换为'void *(*)(void *)

  13. 13

    将Collection <myClass>转换为Collection <String>

  14. 14

    将参数传递给可变参数函数时,强制转换为void *有什么作用?

  15. 15

    检查 int 是否在范围内时无法将 void 转换为 int

  16. 16

    将地址转换为函数:使用“ void * void”

  17. 17

    无法将void转换为java.lang.Void

  18. 18

    将float转换为datetime时出错

  19. 19

    将DICOM转换为JPEG时出错

  20. 20

    将double转换为int时出错

  21. 21

    将Object []转换为byte []时出错

  22. 22

    将float转换为datatime时出错

  23. 23

    将varchar转换为datetime时出错

  24. 24

    将jpg转换为pdf时出错

  25. 25

    将jpg转换为pdf时出错

  26. 26

    将double转换为BigInteger时出错

  27. 27

    将kml转换为geojson时出错

  28. 28

    将int转换为NSNumber时出错

  29. 29

    将mysql转换为mysqli时出错

热门标签

归档