【发布时间】:2014-12-05 20:37:29
【问题描述】:
我正在尝试链接到我的 QT 应用程序中的外部库。外部库有一个头文件,其中包含我试图调用的以下相关代码:
extern VGRABDEVICE_API bool V_AssignFrameSizeCallback(IGrabChannel* pChannel, void* pFunc);
在提供的demo 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*(通常是因为它们更大,尤其是虚拟继承)。这是第三方库 API 中的错误。在任何情况下,您都不能将函数指针从一种调用约定 (__stdcall) 转换为另一种 (__cdecl)。