gpt4 book ai didi

c++ - 将 void(__cdecl MyClass::*)() 转换为 void * 时出错

转载 作者:行者123 更新时间:2023-11-28 02:36:17 25 4
gpt4 key购买 nike

我正在尝试链接到我的 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*是数据指针,不是函数指针。根据 C++ 标准,两者之间的转换预计不会起作用。某些平台提供更强的保证...例如 Windows GetProcAddress和 *nix dlsym将两者混合。

接下来,您的 &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 进行回调实例。

关于c++ - 将 void(__cdecl MyClass::*)() 转换为 void * 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27324265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com