Using templates in delegates

I have to create a template class for parsing http requests. I also have to create delegates that will be fired when a response is received.
in .h file:

    template <typename SaveInfo>
    class UHttpManager_Base : public UObject
    {
    
    	DECLARE_EVENT_TwoParams(UHttpManager_Base,FOnPostReceived,const SaveInfo&, const int32 /*ResponseCode*/);
    	DECLARE_EVENT_TwoParams(UHttpManager_Base,FOnPutReceived,bool,const int32 /*ResponseCode*/);
    	DECLARE_EVENT_TwoParams(UHttpManager_Base,FOnDeleteReceived,bool,const int32 /*ResponseCode*/);
    	DECLARE_EVENT_TwoParams(UHttpManager_Base,FOnGetListOfsReceived,const TArray<SaveInfo>&,const int32 /*ResponseCode*/);
    	DECLARE_EVENT_TwoParams(UHttpManager_Base,FOnGetReceived,const SaveInfo&,const int32 /*ResponseCode*/);
    public:
    	UHttpManager_Base() : HttpModule(&FHttpModule::Get()){}
    	/*HTTP verbs:*/
    	/*When process a request it's supposed to be used every delegate when respond is received.*/
    	FOnPostReceived& Post(const SaveInfo& InfoToPost);
    	FOnPutReceived& Put(const SaveInfo& InfoToPut);
    	FOnDeleteReceived& Delete(uint32 IDtoDelete);
    	FOnGetListOfsReceived& GetListOfSaves();
    	FOnGetReceived& Get(uint32 IDtoGet);

private:
	
	/** When response is received */
	virtual void OnGetTemplateReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);

	/*Post*/
	void OnPostReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
	FOnPostReceived OnPostReceivedDelegate;
	/*Put*/
	void OnPutReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
	FOnPutReceived OnPutReceivedDelegate;
	/*Delete*/
	void OnDeleteReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
	FOnDeleteReceived OnDeleteReceivedDelegate;
	/*GetList*/
	void OnGetListOfsReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
	FOnGetListOfsReceived OnGetListOfsReceivedDelegate;
	/*Get */
	void OnGetReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
	FOnGetReceived OnGetReceivedDelegate;

in .cpp file
#pragma region Requests

template <typename SaveInfo>
typename UHttpManager_Base<SaveInfo>::FOnPostReceived& UHttpManager_Base<SaveInfo>::Post(const SaveInfo& InfoToPost)
{
	TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request =	GetHttpModule()->CreateRequest();
	Request->OnProcessRequestComplete().BindUObject(this,&UHttpManager_Base<SaveInfo>::OnPostReceivedResponse);
	Request->SetURL(GetFullPathURL());
	Request->SetVerb("POST");
	Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
	Request->SetContentAsString(JsonManager->ChangeSaveJsonAndGetString(InfoToPost));
	Request->ProcessRequest();
	return OnPostReceivedDelegate;
}

template <typename SaveInfo>
typename UHttpManager_Base<SaveInfo>::FOnPutReceived& UHttpManager_Base<SaveInfo>::Put(const SaveInfo& InfoToPut)
{
	TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request =	GetHttpModule()->CreateRequest();
	Request->OnProcessRequestComplete().BindUObject(this,&UHttpManager_Base<SaveInfo>::OnPutReceivedResponse);
	Request->SetURL(ConcatURLWith(FString::FromInt(InfoToPut.ID))); /*Get the Base URL and append a  ID to get the right URL to PUT.*/
	Request->SetVerb("PUT");
	Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
	Request->SetContentAsString(JsonManager->ChangeSaveJsonAndGetString(InfoToPut));
	Request->ProcessRequest();
	return OnPutReceivedDelegate;
}
template <typename SaveInfo>
typename UHttpManager_Base<SaveInfo>::FOnDeleteReceived& UHttpManager_Base<SaveInfo>::Delete(uint32 IDtoDelete)
{
	TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request =	GetHttpModule()->CreateRequest();
	Request->OnProcessRequestComplete().BindUObject(this, &UHttpManager_Base<SaveInfo>::OnDeleteReceivedResponse);
	Request->SetURL(ConcatURLWith(FString::FromInt(IDtoDelete)));
	Request->SetVerb("DEL");
	Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
	/*No content*/
	Request->ProcessRequest();
	return OnDeleteReceivedDelegate;
}
template <typename SaveInfo>
typename UHttpManager_Base<SaveInfo>::FOnGetListOfsReceived& UHttpManager_Base<SaveInfo>::GetListOfSaves()
{
	TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request =	GetHttpModule()->CreateRequest();
	Request->OnProcessRequestComplete().BindUObject(this, &UHttpManager_Base<SaveInfo>::OnGetListOfsReceivedResponse);
	Request->SetURL(DefaultURL + FullListURI);
	Request->SetVerb("GET");
	Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
	Request->ProcessRequest();
	return OnGetListOfsReceivedDelegate;
}
template <typename SaveInfo>
typename UHttpManager_Base<SaveInfo>::FOnGetReceived& UHttpManager_Base<SaveInfo>::Get(uint32 IDtoGet)
{
	TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request =	GetHttpModule()->CreateRequest();
	Request->OnProcessRequestComplete().BindUObject(this, &UHttpManager_Base<SaveInfo>::OnGetReceivedResponse);
	Request->SetURL(ConcatURLWith(FString::FromInt(IDtoGet)));
	Request->SetVerb("GET");
	Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
	Request->ProcessRequest();
	return OnGetReceivedDelegate;
}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::InitJson()
{
	TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request =	GetHttpModule()->CreateRequest();
	Request->OnProcessRequestComplete().BindUObject(this,&UHttpManager_Base<SaveInfo>::OnGetTemplateReceived);
	Request->SetURL(GetFullPathEmptyURL());
	Request->SetVerb("GET");
	Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
	Request->ProcessRequest();
}


#pragma endregion Requests


#pragma region Response

template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnPostReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response,
	bool bWasSuccessful)
{
	if(bWasSuccessful)
	{
		OnPostReceivedDelegate.Broadcast(JsonManager->GetSaveFromString(Response->GetContentAsString()),Response->GetResponseCode());
		OnPostReceivedDelegate.Clear();
	}
	
}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnPutReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response,
	bool bWasSuccessful)
{
	if(bWasSuccessful)
	{
		OnPutReceivedDelegate.Broadcast(JsonManager->GetBoolValueFromString(Response->GetContentAsString()),Response->GetResponseCode());
		OnPutReceivedDelegate.Clear();
	}
	
}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnDeleteReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response,
	bool bWasSuccessful)
{
	if(bWasSuccessful)
	{
		OnDeleteReceivedDelegate.Broadcast(JsonManager->GetBoolValueFromString(Response->GetContentAsString()),Response->GetResponseCode());
		OnDeleteReceivedDelegate.Clear();
	}

}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnGetListOfsReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
	if(bWasSuccessful)
	{
		OnGetListOfsReceivedDelegate.Broadcast(JsonManager->GetSaveListFromString(Response->GetContentAsString()),Response->GetResponseCode());
		OnGetListOfsReceivedDelegate.Clear();
	}
}


template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnGetReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response,
	bool bWasSuccessful)
{
	if(bWasSuccessful)
	{
		OnGetReceivedDelegate.Broadcast(JsonManager->GetSaveFromString(Response->GetContentAsString()),Response->GetResponseCode());
		OnGetReceivedDelegate.Clear();
	}
}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnGetTemplateReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
	JsonManager->InitJsonObject(Response->GetContentAsString());
}
#pragma endregion Response

The problem is when I tried to call Post function:

				ManagerSubsystem->GetColorManager()->Post(BackgroundColorToSave).AddUObject(this,&UCPP_CreateGuild::OnColorRespondReceived);

I’ve got an error:

  ProjectFiles: [LNK2019] unresolved external symbol "public: class UHttpManager_Base<struct FServerColorSaveInfo>::FOnPostReceived & __cdecl UHttpManager_Base<struct FServerColorSaveInfo>::Post(struct FServerColorSaveInfo const &)" (?Post@?$UHttpManager_Base@UFServerColorSaveInfo@@@@QEAAAEAVFOnPostReceived@1@AEBUFServerColorSaveInfo@@@Z) referenced in function "public: void __cdecl UCPP_CreateGuild::OnCreateGuildButtonClicked(void)" (?OnCreateGuildButtonClicked@UCPP_CreateGuild@@QEAAXXZ)

The color manager is just an inheritor of the base class HttpManager_Base, which is being stored in a simple subsystem to be called easy.

/**
 * 
 */
class UHttpColorManager final : public UHttpManager_Base<FServerColorSaveInfo>
{
public:
    UHttpColorManager();

private:
	void InitJsonManager() override;

};


inline UHttpColorManager::UHttpColorManager() : UHttpManager_Base()
{
	SetDefaultURIAndFullPath("color/");
	InitJson();
	InitJsonManager();
}

inline void UHttpColorManager::InitJsonManager()
{
	SetJsonManager(MakeShareable(new FColorJsonManager()));
}

Reflection system don’t support templates, it hard to implement reflection on templates as machine code is created for specific types only when specific type is actually used or code or specific type code is hard coded. UE4 have special support for templates for blueprint use but by assumption native array pointer and size variables that are used for it are placed in order in memory.

UObject classes heavily replys on reflection system it also it has lot of convention how UObject classes are structures, thats why they don’t support templates. So i susppect that might be main source of link errors you have, even if not you would eventully have that problem. That said C++ is UE4 is fully functional and you can still use templates non-UObject classes outside of reflection system, you not using UObject features to begin with (UPROPERTY, UFUNCTION etc) so it should not be problem to move them in non-UObject class