UE5.7.1 源码版 UFUNCTION 参数传递踩坑:为什么 BlueprintImplementableEvent(FString) 会编译失败?
前言最近在使用UE5.7.1 源码版开发 UMG Widget 时遇到了一个比较奇怪的问题。同样是UFUNCTION(BlueprintImplementableEvent)下面两个函数一个可以正常编译一个却直接报错。UFUNCTION(BlueprintImplementableEvent) void SwitchBackgroundStation(int32 StationIndex);正常编译。而下面这个UFUNCTION(BlueprintImplementableEvent) void SetTips(FString Tip);却报出了下面的错误ItemTip.gen.cpp(62): error C2511: void UItemTip::SetTips(const FString) UItemTip 中没有找到重载的成员函数刚开始一直以为是Intermediate 缓存没有清理UHT 没有重新生成Live Coding 导致旧代码残留BlueprintImplementableEvent 使用错误结果全部排查后都不是。最终通过查看 UHT 生成代码以及多组实验终于定位到了真正原因。一、问题复现Widget 定义如下UCLASS() class STEPEDITOR_API UItemTip : public UUserWidget { GENERATED_BODY() public: UFUNCTION(BlueprintImplementableEvent) void SetTips(FString Tip); };编译报错ItemTip.gen.cpp(62): error C2511 void UItemTip::SetTips(const FString Tip) UItemTip 中没有找到重载成员函数注意这里有一个细节自己声明的是void SetTips(FString Tip);而 UHT 生成的是void UItemTip::SetTips(const FString Tip)参数类型已经发生了变化。二、查看 UHT 生成代码打开Intermediate/Build/.../ItemTip.gen.cpp可以看到void UItemTip::SetTips(const FString Tip) { ItemTip_eventSetTips_Parms Parms; Parms.Tip Tip; UFunction* Func FindFunctionChecked(NAME_UItemTip_SetTips); ProcessEvent(Func, Parms); }这里已经明确可以看到FString被 UHT 自动转换成了const FString这也是编译失败的直接原因。三、进一步验证为了确认是不是只有 FString 有问题我又增加了几个测试函数。UFUNCTION(BlueprintImplementableEvent) void TestString(FString Str); UFUNCTION(BlueprintImplementableEvent) void TestText(FText Text); UFUNCTION(BlueprintImplementableEvent) void TestName(FName Name); UFUNCTION(BlueprintImplementableEvent) void TestArray(TArrayint32 Array);结果如下参数类型编译结果int32✅ 正常FString❌ C2511FText❌ C2511FName❌同样需要 const 引用TArray❌ C2511可以发现所有大型对象类型都会出现相同的问题。四、为什么 int32 没问题继续测试UFUNCTION(BlueprintImplementableEvent) void SwitchBackgroundStation(int32 StationIndex);完全正常。原因很简单。对于基础类型int32 float boolUHT 不会修改参数类型。生成代码仍然是void SwitchBackgroundStation(int32 StationIndex)所以不会发生签名不一致。五、BlueprintCallable 呢随后又测试了UFUNCTION(BlueprintCallable) void TestString(FString Str);编译报错LNK2019 无法解析的外部符号 UItemTip::TestString(FString)这个错误和前面的不是同一个问题。原因非常简单BlueprintCallable只是把函数暴露给 Blueprint。它仍然是一个普通 C 函数。因此必须提供 cpp 实现void UItemTip::TestString(FString Str) { }否则一定会出现 LNK2019。所以BlueprintCallable 的 LNK2019 属于正常行为BlueprintImplementableEvent 的 C2511 才是本文讨论的问题。六、解决方案把所有大型对象参数统一改成const 引用。例如UFUNCTION(BlueprintImplementableEvent) void SetTips(const FString Tip); UFUNCTION(BlueprintImplementableEvent) void TestText(const FText Text); UFUNCTION(BlueprintImplementableEvent) void TestName(const FName Name); UFUNCTION(BlueprintImplementableEvent) void TestArray(const TArrayint32 Array);修改以后即可正常编译。七、原因分析从实验结果来看可以得到下面几个结论。1、UHT 会自动优化大型对象参数对于FStringFTextFNameTArrayTMap大部分 UStructUHT 在生成代码时会采用const Type而不是值传递。例如自己写void Foo(FString Str);UHT 实际生成void Foo(const FString Str);这样可以避免 Blueprint 调用时产生一次对象拷贝。2、基础类型不会修改例如int32 float bool依旧保持值传递。因此不会出现签名问题。3、BlueprintCallable 与 BlueprintImplementableEvent 的区别BlueprintCallable属于普通 C 函数。必须自己实现。UFUNCTION(BlueprintCallable) void Foo(int32 Value);必须有void UMyClass::Foo(int32 Value) { }否则一定出现LNK2019BlueprintImplementableEvent实现由 Blueprint 完成。不需要 cpp。但是参数类型必须与 UHT 生成的一致。否则会出现C2511八、推荐写法建议以后所有 UFUNCTION 都遵循 Epic 的代码风格。基础类型int32 float bool FVector FRotator直接值传递即可。例如void Foo(int32 Value);大型对象统一使用 const 引用const FString const FText const FName const TArrayT const TMapK,V const FMyStruct例如UFUNCTION(BlueprintCallable) void SetName(const FString Name); UFUNCTION(BlueprintImplementableEvent) void OnDataLoaded(const TArrayint32 Data); UFUNCTION(BlueprintNativeEvent) void OnTextChanged(const FText Text);这样既符合 Epic 官方源码风格也能避免 UHT 自动生成参数时出现签名不一致的问题。九、最终建议对于UE5.7.1 源码版开发建议统一遵循下面的规范参数类型推荐写法int32int32floatfloatboolboolFStringconst FStringFTextconst FTextFNameconst FNameTArrayconst TArrayTTMapconst TMapK,VUStructconst FMyStruct按照这种方式编写UFUNCTION既符合 Unreal Engine 的代码规范也可以避免参数签名带来的编译问题。

相关新闻

告别排队焦虑:2026年硬核 AI 视频创作平台全景实测与免等选型

告别排队焦虑:2026年硬核 AI 视频创作平台全景实测与免等选型

在推流节奏按秒计算的 2026 年,无论是死磕国内抖音电商、小红书的日均测品,还是海外 TikTok 的跨国多矩阵投流,营销素材的消耗速度都已达到了人工流的极限。然而,绝大多数视频创作者和投手在部署 AIGC 工作流时,面临的…

2026/6/27 4:29:27阅读更多 →
工业品代理商,如何借助ERP优化订单处理与分销管理?

工业品代理商,如何借助ERP优化订单处理与分销管理?

对于代理多品类、多型号产品的工业品贸易商而言,增长瓶颈往往不在市场开拓,而在于后端管理难以匹配业务扩张速度。SKU持续增加,订单处理、价格管控、渠道对账等工作日益繁重……这些细碎的运营问题长期累积,不仅直接拉高运营成本、…

2026/6/27 4:29:27阅读更多 →
精准测脂,全域监测—交流八电极体脂秤一体化方案

精准测脂,全域监测—交流八电极体脂秤一体化方案

该方案为交流八电极体脂称方案。该测量方案采用的都是生物电阻抗法(BIM)测体脂,除了体脂率外还可以检测包括水分、肌肉、骨盐量等三十多项指标。相比四电极方案,八电极方案具有更准确的测量结果,同时支持分段指标。称端负责测量体重和阻抗&am…

2026/6/27 4:29:27阅读更多 →
从CBCX外汇平台结构来看,是否有秩序?

从CBCX外汇平台结构来看,是否有秩序?

如果把CBCX外汇放回真实使用场景来看,用户最关心的还是“CBCX外汇的在线支持是否有秩序”是否说得明白。像确认流程材料这样的普通环节,最能反映平台有没有把路径安排清楚、把提示放在合适位置。因此,文章如果从场景、说明和服务边界展开&…

2026/6/27 5:54:32阅读更多 →
采购遥控器,厂家这几个“隐形套路”你发现了吗?

采购遥控器,厂家这几个“隐形套路”你发现了吗?

采购遥控器,厂家这几个“隐形套路”你发现了吗?在我近二十年的遥控器研发与供应链管理生涯中,目睹了无数采购经理、企业主乃至资深工程师在看似简单的遥控器采购上栽了跟头。一块小小的塑料外壳,几枚按键,其背后的水远…

2026/6/27 5:54:32阅读更多 →
映翰通推出 AI 单板计算机 Mo 62A / Mo 68A,加快边缘 AI 产品开发验证

映翰通推出 AI 单板计算机 Mo 62A / Mo 68A,加快边缘 AI 产品开发验证

近日,映翰通推出 AI 单板计算机 Mo 62A / Mo 68A。产品面向边缘 AI 视觉、智能终端和设备侧 AI 应用,可用于工业设备、门禁闸机、机器人、智能摄像头、视觉检测终端等开发场景。相较于传统单板计算机,Mo 62A / Mo 68A 不只关注板卡尺寸、接口…

2026/6/27 5:54:32阅读更多 →
解决JSch连接SFTP的三大常见错误

解决JSch连接SFTP的三大常见错误

使用sftp服务时用到jsch类去实现远程连接ssh服务,这次在实现的过程中遇到了这样几类错误,记录一下,供参考:问题1:Algorithm negotiation fail原因:由于我现在用的jsch版本和服务器版本不兼容导致客户端算法…

2026/6/27 5:54:32阅读更多 →
一次请求的 DI 到底怎么跑:从 HttpContext.RequestServices 创建 Scope 到 ServiceProvider.GetService 的第一跳

一次请求的 DI 到底怎么跑:从 HttpContext.RequestServices 创建 Scope 到 ServiceProvider.GetService 的第一跳

本文想做的事情很具体:把“每请求 scope”的创建和释放,落到两处能在源码里指认、在调试器里复现的点上——RequestServicesFeature 的 getter,以及 Response.RegisterForDisposeAsync。 很多 ASP.NET Core 开发者都听过 scoped 服务“每请求…

2026/6/27 5:54:32阅读更多 →
标记“”不是此版本中的有效语句分隔符

标记“”不是此版本中的有效语句分隔符

问题原因 PowerShell 版本过低‌:Windows 自带的 PowerShell 不支持&&运算符,该运算符从 PowerShell 7.0 才开始支持。 使用 $PSVersionTable 变量 $PSVersionTable 是一个包含PowerShell版本和其他系统信息的哈希表。你可以直接查看这个变量来…

2026/6/27 5:49:31阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/27 5:46:02阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →