UE4 - 宏插入定义时出现错误C2535

时间:2014-06-12 19:02:23

标签: c++ unreal-engine4

我有一个问题,好吧,似乎不应该发生。来自基类的虚函数在"生成"中被覆盖。创建标题调用的宏的文件。

要覆盖的方法是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文件&#34; GENERATED_UCLASS_BODY()&#34;

    // 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没有正确读取生成的文件/宏,并抱怨??

无论如何,它正在破坏开发,因为我无法编译!任何帮助都会很棒。

谢谢,问候 的Øyvind

1 个答案:

答案 0 :(得分:0)

太抱歉了!我只是打错了......真的很尴尬。

但是,对于一些我知道之前已经提出类似问题的人(没有回答):你必须从头文件中提取OMIT声明。生成的头文件(宏)将为您声明它。只需在CPP文件中实现它,即使这个系统使组织和可读性更难。

此致