C++ и C++ Cli не принимают.net форму

Прежде всего, у меня есть два кода:

ManagedGlobalsDeclaration.h

#ifndef MGD_H
#define MGD_H

#include "Editor.h"
#include <vcclr.h>

using namespace System;
using namespace Cube3D;

namespace Cube3D {
    class ManagedGlobals
    {
        public: 
            gcroot<Editor ^> MainEditor;
    };
}

#endif

Editor.h

#ifndef EDITOR_H
#define EDITOR_H

#include "System.h"                     
#include "AddRenderingPipelineCommand.h"
#include "AddMaterial.h"                
#include "P_Material.h"             
#include "P_UMesh.h"                    
#include "Log.h"
#include "ManagedGlobals.h"             //     <------ Error!

#include <vcclr.h>

namespace Cube3D {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    void LoopRender(void);
    void GetRenderingOrder(void);
    String^ GetListbox2Item();

    TextureObject InstancedTexturing[10];
    UMesh InstancedMesh[10];

    /// <summary>
    /// Summary for Editor
    /// </summary>
    ref class Editor : public System::Windows::Forms::Form
    {
        // Bla bla bla....

ManagedGlobals.h

#ifndef MG_H
#define MG_H

#include "ManagedGlobals_Declaration.h"

extern ManagedGlobals MG;

#endif

Но мой компилятор говорит мне, что он не знает редактора в ManagedGlobalsDeclaration. Класс ManagedGlobals объявлен в ManagedGLobalsDeclaration.h, а затем (где-то еще) фактически определен, поэтому я делаю заголовок просто для использования extern. Но почему он не распознает редактор?

Error 29 error C2065: 'Editor' : undeclared identifier

1 ответ

Решение

У вас есть циркулярное включение. Попробуйте вместо этого использовать предварительное объявление:

#ifndef MGD_H
#define MGD_H

#include <vcclr.h>

using namespace System;
using namespace Cube3D;

namespace Cube3D {
    ref class Editor;

    class ManagedGlobals
    {
        public: 
            gcroot<Editor ^> MainEditor;
    };
}

#endif
Другие вопросы по тегам