Ошибка компилятора C3646, но код работал исправно до внесения изменений, никак не связанных с ошибкой. В чем проблема?
Привет, я учусь писать код на C++, а также изучаю UnrealEngine 5 и его api для C++, сейчас практикуюсь на личном проекте, пытаюсь сделать шутер от 3 лица, просто для обучения.Сегодня столкнулся с проблемой, которая выходит за рамки моего понимания(.
Сама ошибка:
"1>------ Building 6 action(s) started ------
1>[1/6] Compile [x64] TutorialRifleWeapon.cpp
1>F:\aue\ShooterTutorial\Source\ShooterTutorial\Public\Weapon\TutorialBaseWeapon.h(23): error C3646: ‘CharacterDead’: unknown override specifier
1>F:\aue\ShooterTutorial\Source\ShooterTutorial\Public\Weapon\TutorialBaseWeapon.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>[2/6] Compile [x64] AIRifleWeapon.cpp
1>F:\aue\ShooterTutorial\Source\ShooterTutorial\Public\Weapon\TutorialBaseWeapon.h(23): error C3646: ‘CharacterDead’: unknown override specifier
1>F:\aue\ShooterTutorial\Source\ShooterTutorial\Public\Weapon\TutorialBaseWeapon.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>[3/6] Compile [x64] TutorialBaseWeapon.cpp
1>F:\aue\ShooterTutorial\Source\ShooterTutorial\Public\Weapon\TutorialBaseWeapon.h(23): error C3646: ‘CharacterDead’: unknown override specifier
1>F:\aue\ShooterTutorial\Source\ShooterTutorial\Public\Weapon\TutorialBaseWeapon.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>Total time in Parallel executor: 2.30 seconds
Я никак не изменял и не трогал делегат CharacterDead, и вдруг он начал выдавать ошибку.
"Ладно, - подумал я, - у меня есть сохраненная версия до внесения этих изменений, давай попробуем внести изменения по порядку и посмотрим, где кроется причина.
Далее код используемых файлов:
TutorialBaseCharacter.h заголовок, в котором объявлен делегат:
// Game. All Rights Reserved.
#pragma once
include “CoreMinimal.h”
include “GameFramework/Character.h”
include “TutorialBaseCharacter.generated.h”
include “CoreMinimal.h”
include “GameFramework/Actor.h”
include “MyCoreTypes.h”
include “TutorialBaseWeapon.generated.h”
class ATutorialBaseCharacter;
UCLASS()
class SHOOTERTUTORIAL_API ATutorialBaseWeapon : public AActor
{
GENERATED_BODY()
public:
ATutorialBaseWeapon();
FOnCharacterDead CharacterDead;
/*
*/
TutorialBaseWeapon.cpp. здесь происходит bind функции:
// Game. All Rights Reserved.
include “Weapon/TutorialBaseWeapon.h”
include “Components/SkeletalMeshComponent.h”
include “DrawDebugHelpers.h”
include “Engine/World.h”
include “GameFramework/Character.h”
include “GameFramework/Controller.h”
include “NiagaraComponent.h”
include “NiagaraFunctionLibrary.h”
include “TimerManager.h”
include “TutorialUtils.h”
include “MyCoreTypes.h”
include “Player/HealthComponent.h”
include “Player/TutorialBaseCharacter.h”
include “Kismet/GameplayStatics.h”
DEFINE_LOG_CATEGORY_STATIC(LogBaseWeapon, All, All)
check(WeaponMesh);
checkf(DefaultAmmo.Bullets > 0, TEXT("Bullets count couldn't be less or equal zero"));
checkf(DefaultAmmo.Clips > 0, TEXT("Clips count couldn't be less or equal zero"));
CurrentAmmo = DefaultAmmo;
}
и описываю функцию
AController* ATutorialRifleWeapon::GetController() const
{
const auto Pawn = Cast(GetOwner());
return Pawn ? Pawn->GetController() : nullptr;
}
И так же в двух хедерах: TutorialRifleWeapon.h и AAIRifleWeapon.h я объявляю две функции
AController* GetController() const; и такую же в AAIRifleWeapon.h
Это все изменения, как можно заметить я никак не трогаю делегат, но после выполнения этого кода появляется ошибка.
С помощью гита я 2 раза откатывался назад, чтобы убедиться. Именно этот код каким-то образом вызывает ошибку.
В чем причина?
Попробуйте делать меньше изменений за один раз, тогда будет понятнее какой именно добавленный код вызывает ошибку.
А так похоже на проблему с переопределением виртуальных функций базового класса.