@kevsinn

Ошибка компилятора 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”

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnCharacterDead);

class UCameraComponent;
class USpringArmComponent;
class UHealthComponent;
class UTextRenderComponent;
class UWeaponComponent;

UCLASS()
class SHOOTERTUTORIAL_API ATutorialBaseCharacter : public ACharacter
{
GENERATED_BODY()

public:
ATutorialBaseCharacter(const FObjectInitializer& ObjInit);

virtual void Tick(float DeltaTime) override;
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

void SetPlayerColor(const FLinearColor& Color);

FOnCharacterDead CharacterDead;
/*
*/

Код TutorialBaseCharacter.cpp, в котором вызывается функция broadcast():

void ATutorialBaseCharacter::OnDeath()
{
// PlayAnimMontage(DeathAnimation);
WeaponComponent->DestroyComponent();
GetCharacterMovement()->DisableMovement();
SetLifeSpan(LifeSpanOnDeath);

if (Controller)
{
Controller->ChangeState(NAME_Spectating);
}
WeaponComponent->StopFire();

CharacterDead.Broadcast();

GetMesh()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
GetMesh()->SetSimulatePhysics(true);
GetMesh()->SetMassOverrideInKg(NAME_None, CharacterMass);
GetCapsuleComponent()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn, ECollisionResponse::ECR_Ignore);
GetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn, ECollisionResponse::ECR_Ignore);
GetCapsuleComponent()->SetCapsuleSize(10.0f, 25.0f, false);
}

TutorialBaseWeapon.h code:
#pragma once

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)

ATutorialBaseWeapon::ATutorialBaseWeapon()
{
PrimaryActorTick.bCanEverTick = false;
WeaponMesh = CreateDefaultSubobject(“Weapon Mesh”);
SetRootComponent(WeaponMesh);
}

void ATutorialBaseWeapon::BeginPlay()
{
Super::BeginPlay();

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;
}

/**/
void ATutorialBaseWeapon::SetWeaponInvisible()
{
WeaponMesh->SetVisibility(false);
}

void ATutorialBaseWeapon::Initialize()
{
ATutorialBaseCharacter* BaseCharacter = Cast(GetOwner());
if (BaseCharacter)
{
BaseCharacter->CharacterDead.AddDynamic(this, &ATutorialBaseWeapon::SetWeaponInvisible);
}
}

Собственно это код, который работал нормально до изменений, не имеющих никакого отношения к самому делегату.

Изменения, которые вызывают эту ошибку (без этих изменений все работает нормально):

В файле AIRifleWeapon.cpp меняю строку
HittenActor->TakeDamage(Damage, FDamageEvent{}, GetPlayerController(), this);
на
HittenActor->TakeDamage(Damage, FDamageEvent{}, GetController(), this);

и описываю функцию
AController* AAIRifleWeapon::GetController() const
{
const auto Pawn = Cast(GetOwner());
return Pawn ? Pawn->GetController() : nullptr;
}

в файле TutorialBaseWeapon.cpp удаляю этот код:

APlayerController* ATutorialBaseWeapon::GetPlayerController() const
{
const auto Player = Cast(GetOwner());
if (!Player) return nullptr;

return Player->GetController();
}

строку - const auto Controller = GetPlayerController();
меняю на
const auto Controller = Character->GetController();

в файле TutorialRifleWeapon.cpp

меняю строку
HittenActor ->TakeDamage(Damage, FDamageEvent{}, GetPlayerController(), this);
на
HittenActor->TakeDamage(Damage, FDamageEvent{}, GetController(), this);

и описываю функцию
AController* ATutorialRifleWeapon::GetController() const
{
const auto Pawn = Cast(GetOwner());
return Pawn ? Pawn->GetController() : nullptr;
}

И так же в двух хедерах: TutorialRifleWeapon.h и AAIRifleWeapon.h я объявляю две функции
AController* GetController() const; и такую же в AAIRifleWeapon.h

Это все изменения, как можно заметить я никак не трогаю делегат, но после выполнения этого кода появляется ошибка.
С помощью гита я 2 раза откатывался назад, чтобы убедиться. Именно этот код каким-то образом вызывает ошибку.
В чем причина?
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы