UE4 — Ошибка C2535, когда макрос вставляет определение

У меня проблема, которая, кажется, не должна происходить. Виртуальная функция из базового класса переопределяется в файле «генерации», который создает макрос, который вызывает заголовок.

Метод для переопределения virtual void GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const OVERRIDE;

Это утверждение находится в файле генерации (макро-ад, второй кодовый блок), который, в свою очередь, вставляется вверху определения класса в обычном заголовке (первый кодовый блок ниже).

Чтобы быть грубым и не очень расплывчатым, вот код, который терпит неудачу:

Файл класса .h

    UCLASS()
class AABaseInventoryItem : public AActor
{
GENERATED_UCLASS_BODY()

// Properties
UPROPERTY(Category = Item, BlueprintReadOnly, Replicated)
uint16 ItemIndex;           // Unique item index

// Overrides
virtual void ReceiveActorBeginOverlap(AActor *OtherActor) OVERRIDE;
};

Файл .h, содержащий макрос «GENERATED_UCLASS_BODY ()»

    // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
/*===========================================================================
C++ class header boilerplate exported from UnrealHeaderTool.
This is automatically generated by the tools.
DO NOT modify this manually! Edit the corresponding .h files instead!
===========================================================================*/

#include "ObjectBase.h"
#ifdef WTAGAME_ABaseInventoryItem_generated_h
#error "ABaseInventoryItem.generated.h already included, missing '#pragma once' in ABaseInventoryItem.h"#endif
#define WTAGAME_ABaseInventoryItem_generated_h

#define AABaseInventoryItem_EVENTPARMS
#define AABaseInventoryItem_RPC_WRAPPERS
#define AABaseInventoryItem_CALLBACK_WRAPPERS
#define AABaseInventoryItem_INCLASS \
private: \
static void StaticRegisterNativesAABaseInventoryItem(); \
friend WTAGAME_API class UClass* Z_Construct_UClass_AABaseInventoryItem(); \
public: \
DECLARE_CLASS(AABaseInventoryItem, AActor, COMPILED_IN_FLAGS(0), 0, WTAGame, NO_API) \
/** Standard constructor, called after all reflected properties have been initialized */    NO_API AABaseInventoryItem(const class FPostConstructInitializeProperties& PCIP); \
DECLARE_SERIALIZER(AABaseInventoryItem) \
/** Indicates whether the class is compiled into the engine */    enum {IsIntrinsic=COMPILED_IN_INTRINSIC}; \
virtual void GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const OVERRIDE;#undef UCLASS_CURRENT_FILE_NAME
#define UCLASS_CURRENT_FILE_NAME AABaseInventoryItem#undef UCLASS
#undef UINTERFACE
#define UCLASS(...) \
AABaseInventoryItem_EVENTPARMS#undef GENERATED_UCLASS_BODY
#undef GENERATED_IINTERFACE_BODY
#define GENERATED_UCLASS_BODY() \
public: \
AABaseInventoryItem_RPC_WRAPPERS \
AABaseInventoryItem_CALLBACK_WRAPPERS \
AABaseInventoryItem_INCLASS \
public:

Если я помещаю переопределение в фактический заголовочный файл, я получаю ошибку компилятора C2535 (функция-член уже определена / объявлена). Однако, когда я удаляю объявление, я получаю неразрешенную внешнюю ошибку символа (LNK2001), поскольку я реализовал ее в файле CPP. ТАК, мне кажется, что MSVS 2013 неправильно читает сгенерированный файл / макрос и жалуется ??

В любом случае, это разрушает разработку, так как я не могу скомпилировать! Любая помощь будет потрясающей.

С уважением
Oyvind

0

Решение

Так извините, ребята! У меня просто была опечатка … Действительно неловко.

Но некоторые люди, которых я знаю, задавали похожие вопросы по этому поводу раньше (без ответа): вы должны пропустить декларацию из заголовочного файла. Сгенерированный заголовочный файл (макрос) объявит его для вас. Просто внедрите его в файл CPP, хотя эта система затрудняет организацию и удобство чтения.

С уважением

0

Другие решения


По вопросам рекламы [email protected]