Cannot use UObject method delegates with raw pointers

I am trying to implement a timer in a simple C++ class。
I compiled the project with vs2022 and received an error message
1>[1/5] Compile CTickMgr.cpp
1>D:\Program Files\Epic Games\UE_5.1\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h(516): error C2338: static_assert failed: ‘You cannot use UObject method delegates with raw pointers.’
Here is my code implementation:
CTickMgr.h

#include "TimerManager.h"
#include "GameFramework/Actor.h"
#include "Engine/World.h"
#include "Engine/GameInstance.h"
#include "EngineUtils.h"
class CTickMgr
{
public:
	CTickMgr();
	virtual ~CTickMgr();
	void OnTick();
	static CTickMgr* Inst();
	void Init(FTimerManager& TimerManager);
	FTimerHandle TimerHandle;
};

CTickMgr.cpp

static CTickMgr* g_pTickMgr = NULL;
CTickMgr::CTickMgr()
{
}

CTickMgr::~CTickMgr()
{
}

void CTickMgr::Init(FTimerManager& TimerManager)
{
	TimerManager.SetTimer(TimerHandle, FTimerDelegate::CreateUObject(this, &CTickMgr::OnTick), 0.01, true);
}

void CTickMgr::OnTick()
{
	UE_LOG(LogTemp, Error, TEXT("CTickMgr::OnTick"));
}

CTickMgr* CTickMgr::Inst()
{
	if (NULL != g_pTickMgr)
		g_pTickMgr = new CTickMgr();
	return g_pTickMgr;
}

MyGameMode.cpp

void MyGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
	Super::InitGame(MapName, Options, ErrorMessage);
	FTimerManager& TimerManager = GetWorld()->GetTimerManager();
	CTickMgr::Inst()->Init(TimerManager);
}

I changed the code and it works

void CTickMgr::Init(FTimerManager& TimerManager)
{
	//FTimerDelegate TimerDelegate = FTimerDelegate::CreateUObject(this, &CTickMgr::OnTick);
	FTimerDelegate TimerDelegate;
	TimerDelegate.BindLambda([this] {
		OnTick();
		});
	TimerManager.SetTimer(TimerHandle, TimerDelegate, 0.01, true);
}

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.