I am having an issue with UENUM and .generated.* files.
So, I am using TEnumAsByte in my code file which works fine but the .generated.* files directly specify the enum instead of using TEnumAsByte which then throws compilation errors.
It is solved by manually adding TEnumAsByte in .generated files but then I have to compile the same project 2 times while manually adding TEnumAsByte.
I tried moving enums to the same header as my class,
converting them to an enum class uint8,
putting them inside namespaces and vice-versa,
recompiling, updating all vs files,
changing unreal version,
but nothing seems to work.
UENUM(BlueprintType)
enum class EAIAlertnessLevel : uint8 // I also tried without class and using namespace
{
AlertnessLevelNone = 0 UMETA(DisplayName="None"),
Curious UMETA(DisplayName="Curious"),
Alert UMETA(DisplayName="Alert"),
Fight UMETA(DisplayName="Fight")
};
File: MyClass.h
// Throws compilation error
UFUNCTION(BlueprintNativeEvent) // Works fine when not exposed to blueprints
void IncreaseAIAlertness(TEnumAsByte<EAIAlertnessLevel> CurrentAlertness);
1>{$ProjectDir}/Intermediate/Build/Win64/UE4Editor/Inc/{$ProjectName}/MyClass.gen.cpp(110): error C2511: 'void AMyClass::IncreaseAIAlertness(EAIAlertnessLevel)': overloaded member function not found in 'AMyClass'
1> {$ProjectName}\Source\{$ProjectName}/Player/Bullets/MyClass.h(17): note: see declaration of 'AMyClass'
1>{$ProjectDir}/Intermediate/Build/Win64/UE4Editor/Inc/{$ProjectName}/MyClass.gen.cpp(115): error C2352: 'UObject::FindFunctionChecked': illegal call of non-static member function
1> F:\EpicGamesLibrary\UE_4.26\Engine\Source\Runtime\CoreUObject\Public\UObject/Object.h(1028): note: see declaration of 'UObject::FindFunctionChecked'
1>F:\EpicGamesLibrary\UE_4.26\Engine\Source\Runtime\Core\Public\Containers/EnumAsByte.h(20): warning C4996: 'TEnumAsByte_EnumClass<true>': TEnumAsByte is not intended for use with enum classes - please derive your enum class from uint8 instead. Please update your code to the new API before upgrading to the next release, otherwise your project will no longer compile.
1> F:\EpicGamesLibrary\UE_4.26\Engine\Source\Runtime\Core\Public\Containers/EnumAsByte.h(10): note: see declaration of 'TEnumAsByte_EnumClass'
I think the problem is with UHT because as soon as I change EAIAlertnessLevel into TEnumAsByte in .generated files, the project compiles without any errors.
Its says that for the function is .generated files.
If I remove the UFUNCTION() from my original function (in MyClass.h) or change EAIAlertnessLevel into TEnumAsByte in .generated files, it works fine.
Remove additional specifier class from enum declaration also I’m not very using uint8 here. You can also use without it. :
UENUM(BlueprintType)
enum EAIAlertnessLevel : uint8 // remove class at here
{
AlertnessLevelNone = 0 UMETA(DisplayName="None"),
Curious UMETA(DisplayName="Curious"),
Alert UMETA(DisplayName="Alert"),
Fight UMETA(DisplayName="Fight")
};
Next. You need to show its referance point to compiler, thus need to include. Additionally, while signing your function, you dont need TEnumAsByte or you can put depens on you, can do like several ways
Put your reference
include "ExternalEnums.h"
UFUNCTION(BlueprintNativeEvent) // Works fine when not exposed to blueprints
void IncreaseAIAlertness(EAIAlertnessLevel CurrentAlertness);
I suggest to include your libs in cpp. Thus in the header file, to increase your compilation speed, you can always pretell compiler as this is `class` will be used in cpp and dont use `include` in your header.
class EAIAlertnessLevel; // do after include tab before UCLASS()
UFUNCTION(BlueprintNativeEvent)
void IncreaseAIAlertness(EAIAlertnessLevel CurrentAlertness);
virtual void IncreaseAIAlertness_Implementation(EAIAlertnessLevel CurrentAlertness)