gpt4 book ai didi

closures - C++Builder控制台应用程序: linking to a __closure based method

转载 作者:行者123 更新时间:2023-12-03 09:02:26 26 4
gpt4 key购买 nike

首先,请原谅我的标题。不太确定如何问这个问题:

我有一个应用程序需要转换为控制台应用程序(请注意,该应用程序作为 VCL 样式 Windows 应用程序运行良好)。该应用程序使用一些具有回调函数的第三方小部件。但是,当我尝试编译它时,出现“无法转换...”错误,如下所示:

Cannot convert 'void(Tobject *, TErrorEventParams *)' to 'TErrorEvent'

TErrorEvent 定义为:

typedef void __fastcall (__closure* TErrorEvent)(System::TObject* Sender, TErrorEventParams *e);

导致错误的行是:

handler->OnError = errorHandler;

errorHandler 的代码是:

void __fastcall errorHandler(System::TObject* Sender, TErrorEventParams *e)
{
memoLine = e->Description;
updateLog();
}

最佳答案

__closure 类型是指向非静态类方法的指针。编译器不允许您在需要 __closure 的地方分配独立的非类函数。它需要一个指向类对象方法的指针。卡雷姆的回答向您展示了实现这一目标的一种方法。

但是,有一种使用非类函数的方法,即使用帮助器 TMethod struct(这就是 __closure 在幕后实现的方式)。

首先,向您的事件处理程序添加显式“this”参数:

void __fastcall errorHandler(void *This, TObject* Sender, TErrorEventParams *e)
{
memoLine = e->Description;
updateLog();
}

然后像这样分配事件处理程序:

TMethod m;
m.Code = &errorHandler
m.Data = NULL; // any value you want to pass to the 'This' parameter...
handler->OnError = reinterpret_cast<TErrorEvent&>(m);

关于closures - C++Builder控制台应用程序: linking to a __closure based method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49312580/

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