0

我在头文件中遇到了常见的错误,如下所示。

Error   54  error C3083: 'Resources': the symbol to the left of a '::' must be a type   e:\users\nkosi\documents\visual studio 2010\projects\directx games\direct2d\dx2dhelper\dx2dhelper\sprite.h  28  1   DX2DHelper
Error   55  error C2039: 'DX2DImage' : is not a member of 'DX2DHelper'  e:\users\nkosi\documents\visual studio 2010\projects\directx games\direct2d\dx2dhelper\dx2dhelper\sprite.h  28  1   DX2DHelper
Error   56  error C2061: syntax error : identifier 'DX2DImage'  e:\users\nkosi\documents\visual studio 2010\projects\directx games\direct2d\dx2dhelper\dx2dhelper\sprite.h  28  1   DX2DHelper
Error   57  error C3083: 'Resources': the symbol to the left of a '::' must be a type   e:\users\nkosi\documents\visual studio 2010\projects\directx games\direct2d\dx2dhelper\dx2dhelper\sprite.h  32  1   DX2DHelper
Error   58  error C2039: 'DX2DImage' : is not a member of 'DX2DHelper'  e:\users\nkosi\documents\visual studio 2010\projects\directx games\direct2d\dx2dhelper\dx2dhelper\sprite.h  32  1   DX2DHelper
Error   59  error C2143: syntax error : missing ';' before '*'  e:\users\nkosi\documents\visual studio 2010\projects\directx games\direct2d\dx2dhelper\dx2dhelper\sprite.h  32  1   DX2DHelper
Error   60  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   e:\users\nkosi\documents\visual studio 2010\projects\directx games\direct2d\dx2dhelper\dx2dhelper\sprite.h  32  1   DX2DHelper
Error   61  error C2061: syntax error : identifier 'GameBase'   e:\users\nkosi\documents\visual studio 2010\projects\directx games\direct2d\dx2dhelper\dx2dhelper\systemclass.h 30  1   DX2DHelper

但是,对于我的一生,我无法弄清楚我做错了什么。我知道我可能错过了一个分号或其他东西,但我真的想不通。所有头文件都在下面。

DX2DHelper.h

#include "targetver.h"

#define WIN32_LEAN_AND_MEANheaders
// Windows Header Files:
#include <windows.h>

#include <iostream>

#include <D2D1.h>
#include <D2D1Helper.h>
#include <wincodec.h>
#include <D2DBaseTypes.h>
#include <D2Derr.h>

#define DLEX __declspec(dllexport)

#include "GameBase.h"
#include "SystemClass.h"
#include "DX2DImage.h"
#include "Sprite.h"

系统类.h

#ifndef SYSTEMCLASS_H
#define SYSTEMCLASS_H

#include "DX2DHelper.h"

namespace DX2DHelper
{
    namespace Core
    {
        class SystemClass;
        struct WindowOptions;

        struct DLEX WindowOptions {};

        class DLEX SystemClass
        {
        public:
            bool Initialize(WindowOptions options, HINSTANCE hInst);
            void Run(GameBase* game, DX2DInitOptions options);
        private:
            WindowOptions options;    
        };
    }
}
#endif

DX2DImage.h

#ifndef DX2DIMAGE_H
#define DX2DIMAGE_H

#include "DX2DHelper.h"

namespace DX2DHelper
{
    namespace Resources
    {
        class DX2DImage;
        class DX2DImageLoader;

        class DLEX DX2DImageLoader
        {
        public:
            HRESULT LoadFromFile(char* filePath, DX2DImage* image);
        };

        class DLEX DX2DImage
        {
        public:
            friend class DX2DImageLoader;
        };
    }
}

#endif

精灵.h

#ifndef SPRITE_H
#define SPRITE_H

#include "DX2DHelper.h"

namespace DX2DHelper
{
    namespace GameComponents
    {
        class DLEX Sprite
        {
        public:
            void SetImage(DX2DHelper::Resources::DX2DImage* image);

        private:
            DX2DHelper::Resources::DX2DImage* image;
        };
    }
}
#endif

游戏基础.h

#ifndef GAMEBASE_H
#define GAMEBASE_H

#include "DX2DHelper.h"

namespace DX2DHelper
{
    namespace Core
    {
        class DLEX GameBase
        {
        public:
            friend class SystemClass;

            HRESULT Initialize(HINSTANCE hInst, HWND winHandle, struct DX2DInitOptions options);
        };

        struct DLEX DX2DInitOptions {};
    }
}
#endif

如果有人能找出错误,我将不胜感激。我一直在查看相同的文件可能将近一个小时,一个半小时,但我无法修复它。

4

1 回答 1

3

您的标题有(很多)包含循环。例如,DX2DHelper.h包括Sprite.h包括DX2DHelper.h。这可能是导致您的错误的原因。这段代码不是Java,也不是导入语句:#include循环完全杀死编译,即使你没有得到一个特别说明的编译错误。为您的头文件选择一个非循环顺序。

我建议DX2DHelper.h不要在底部包含任何内容。 Sprite.h可以包括DX2DImage.h.

如果您的对象具有循环依赖关系(例如SystemClassand的情况GameBase),您将需要另一种解决方案。前向声明依赖类而不给出其完整声明,例如,SystemClass.h您可能会提前添加某处:

namespace DX2DHelper { namespace Core { class DLEX GameBase; } }

同样在GameBase.h

namespace DX2DHelper { namespace Core { class DLEX SystemClass;} }

当不涉及循环对象依赖项时,这甚至可能是一个好主意——它通常是解决您在这里遇到的标题地狱类型的简单方法。当然,要编译所有内容,您可能需要#include相应实现文件中的相应标头。但是,假设您没有#include任何.cpp/.cc文件,这应该允许所有内容都可以编译,而无需#include您陷入困境。

于 2012-07-14T04:05:13.770 回答