У меня проблема, которая, кажется, не должна происходить. Виртуальная функция из базового класса переопределяется в файле «генерации», который создает макрос, который вызывает заголовок.
Метод для переопределения 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
Так извините, ребята! У меня просто была опечатка … Действительно неловко.
Но некоторые люди, которых я знаю, задавали похожие вопросы по этому поводу раньше (без ответа): вы должны пропустить декларацию из заголовочного файла. Сгенерированный заголовочный файл (макрос) объявит его для вас. Просто внедрите его в файл CPP, хотя эта система затрудняет организацию и удобство чтения.
С уважением