Tencent/puerts

[UE] Bug: 基于模板的静态绑定,使用扩展函数功能时编译报错

Closed this issue · 5 comments

前置阅读 | Pre-reading

Puer的版本 | Puer Version

1.0.5

UE的版本 | UE Version

5.3.2

发生在哪个平台 | Platform

Editor(win)

错误信息 | Error Message

No response

问题重现 | Bug reproduce

使用MakeExtension导出扩展函数时,编译报错
扩展代码如下:

struct FGameplayEffectContextHandleExtension
{
    static FPRGameplayEffectContext* GetEffectContext(FGameplayEffectContextHandle& EffectContextHandle)
    {
	    return static_cast<FPRGameplayEffectContext*>(EffectContextHandle.Get());
    }
};

puerts::DefineClass<FGameplayEffectContextHandle>()
	.Method("GetEffectContext", MakeExtension(&FGameplayEffectContextHandleExtension::GetEffectContext))
	.Register();

报错信息如下:
0>StaticCall.hpp(819): Error C3861 : “GetArgsLen”: 找不到标识符
0>StaticCall.hpp(819): Reference C3861 : “GetArgsLen”: 函数未在模板定义上下文中声明,只能通过实例化上下文中参数相关的查找找到
0>StaticCall.hpp(886): Reference C3861 : 查看对正在编译的函数 模板 实例化“bool puerts::internal::FuncCallHelper<API,std::pair<Ret,std::tuple<>>,false,false,true,false>::callExtension<Ins,FPRGameplayEffectContext*(__cdecl *)(FGameplayEffectContextHandle &),,>(Func &,puerts::v8_impl::API::CallbackInfoType,std::integer_sequence<size_t>)”的引用
with
[
API=puerts::v8_impl::API,
Ret=FPRGameplayEffectContext *,
Ins=FirstDecayType,
Func=FPRGameplayEffectContext *(__cdecl )(FGameplayEffectContextHandle &)
]
0>StaticCall.hpp(897): Reference C3861 : 查看对正在编译的函数 模板 实例化“bool puerts::internal::FuncCallHelper<API,std::pair<Ret,std::tuple<>>,false,false,true,false>::callExtension<Ins,FPRGameplayEffectContext
(__cdecl *)(FGameplayEffectContextHandle &),,>(Func &,puerts::v8_impl::API::CallbackInfoType,std::integer_sequence<size_t>)”的引用
with
[
API=puerts::v8_impl::API,
Ret=FPRGameplayEffectContext *,
Ins=FirstDecayType,
Func=FPRGameplayEffectContext *(__cdecl )(FGameplayEffectContextHandle &)
]
0>StaticCall.hpp(966): Reference C3861 : 查看对正在编译的函数 模板 实例化“bool puerts::internal::FuncCallHelper<API,std::pair<Ret,std::tuple<>>,false,false,true,false>::callExtension<FirstDecayType,FPRGameplayEffectContext
(__cdecl *)(FGameplayEffectContextHandle &),>(Func &&,puerts::v8_impl::API::CallbackInfoType)”的引用
with
[
API=puerts::v8_impl::API,
Ret=FPRGameplayEffectContext *,
Func=FPRGameplayEffectContext *(__cdecl )(FGameplayEffectContextHandle &)
]
0>StaticCall.hpp(970): Reference C3861 : 查看对正在编译的函数 模板 实例化“bool puerts::internal::FuncCallHelper<API,std::pair<Ret,std::tuple<>>,false,false,true,false>::callExtension<FirstDecayType,FPRGameplayEffectContext
(__cdecl *)(FGameplayEffectContextHandle &),>(Func &&,puerts::v8_impl::API::CallbackInfoType)”的引用
with
[
API=puerts::v8_impl::API,
Ret=FPRGameplayEffectContext *,
Func=FPRGameplayEffectContext *(__cdecl *)(FGameplayEffectContextHandle &)
]
0>StaticCall.hpp(975): Reference C3861 : 查看对正在编译的函数 模板 实例化“void puerts::FuncCallWrapper<puerts::v8_impl::API,FPRGameplayEffectContext *(__cdecl *)(FGameplayEffectContextHandle &),FPRGameplayEffectContext *FGameplayEffectContextHandleExtension::GetEffectContext(FGameplayEffectContextHandle &),false,true,false>::ExtensionCallHelper<FGameplayEffectContextHandle &>::call<>(puerts::v8_impl::API::CallbackInfoType)”的引用
0>StaticCall.hpp(976): Reference C3861 : 查看对正在编译的函数 模板 实例化“void puerts::FuncCallWrapper<puerts::v8_impl::API,FPRGameplayEffectContext *(__cdecl *)(FGameplayEffectContextHandle &),FPRGameplayEffectContext *FGameplayEffectContextHandleExtension::GetEffectContext(FGameplayEffectContextHandle &),false,true,false>::ExtensionCallHelper<FGameplayEffectContextHandle &>::call<>(puerts::v8_impl::API::CallbackInfoType)”的引用
0>JsExtension_Product.cpp(44): Reference C3861 : 查看对正在编译的函数 模板 实例化“void puerts::FuncCallWrapper<puerts::v8_impl::API,FPRGameplayEffectContext *(__cdecl *)(FGameplayEffectContextHandle &),FPRGameplayEffectContext *FGameplayEffectContextHandleExtension::GetEffectContext(FGameplayEffectContextHandle &),false,true,false>::callExtensionWithDefaultValues<>(puerts::v8_impl::API::CallbackInfoType)”的引用
0>JsExtension_Product.cpp(44): Reference C3861 : 查看对正在编译的函数 模板 实例化“void puerts::FuncCallWrapper<puerts::v8_impl::API,FPRGameplayEffectContext *(__cdecl *)(FGameplayEffectContextHandle &),FPRGameplayEffectContext *FGameplayEffectContextHandleExtension::GetEffectContext(FGameplayEffectContextHandle &),false,true,false>::callExtensionWithDefaultValues<>(puerts::v8_impl::API::CallbackInfoType)”的引用

是最新的代码吗?更新到最新代码

你这个问题最新版本应该已经解决了

我刚才确认了一下 我们目前的puerts是在2024.1.18从master上合并下来的,也就是说已经包含到了Unreal_v1.0.6p1
麻烦告知一下这个bug是在哪次提交修复的,我确认一下我们是否已经更新到了这次修复

更新后正常了