C++ C2039:类不是命名空间的成员

C++ C2039:类不是命名空间的成员,c++,C++,Mage/Interface/Context.h #pragma once #include <Mage/Interface/Element.h> #include <Mage/Renderer/RenderingContext.h> #include <Mage/Renderer/VertexBuffer.h> #include <glm/glm.hpp> namespace Mage { namespace Interface {

Mage/Interface/Context.h

#pragma once

#include <Mage/Interface/Element.h>
#include <Mage/Renderer/RenderingContext.h>
#include <Mage/Renderer/VertexBuffer.h>

#include <glm/glm.hpp>

namespace Mage {
    namespace Interface {
        class Context {

        protected:
            RenderingContext* ctx;
            VertexBuffer* vbo;
            glm::mat4 projection;
            Mage::Interface::Frame* uiParent;

        public:
            Context(RenderingContext* ctx);
            ~Context();

            void render();
            Mage::Interface::Frame* createFrame();
        };
    }
}
#pragma once

#include <vector>

#include <Mage/Interface/Context.h>

#include <glm/glm.hpp>

namespace Mage {
    namespace Interface {
        class Element {

        protected:
            Mage::Interface::Context* ctx;
            std::vector<Element*> children;
            glm::vec3 position;
            float scale;

        public:
            virtual void draw();

            void attach(Element* child) {
                this->children.push_back(child);
            }

            inline glm::vec3 getPosition() {
                return this->position;
            }

            float getScale() {
                return this->scale;
            }
        };

        // Frame is an untextured, single colour quad. Frame may contain other
        // Elements.
        class Frame : public Element {

        public:
            Frame();
            Frame(glm::vec3 pos);
            Frame(float width, float height);
            Frame(glm::vec3 pos, float width, float height);
        };
    }
}

当我取出
Mage::Interface::Context*ctx
时,代码编译得很好。我想我一定错过了一个分号,但我看不到它——我觉得这一切都很好。

你有一个循环依赖。Element.h包括Context.h和Context.h包括Element.h,这是行不通的


解决这个问题的方法是转发声明类型,而不是尽可能地包含它们的头,这也会减少编译时间。

谢谢。从字面上看,这是有史以来最没有帮助的编译器错误;你可能认为打印一条关于循环依赖关系的消息会很容易,但事实并非如此。循环依赖性只是您的设计问题。编译器问题就是它报告的问题。您可以具有循环依赖项,但需要以不同的方式处理它们。你还没有看到毫无用处的消息。@luk32:在我听到一些关于无用的编译器错误的恐怖故事之后,我准备相信你。你可能是对的,我倾向于过于热心地将类拆分成单独的文件。
Error   C2039   'Context': is not a member of 'Mage::Interface' Mage2D  c:\users\jesse\documents\visual studio 2015\projects\mage2d\include\mage\interface\element.h    14

Error   C2238   unexpected token(s) preceding ';'   Mage2D  c:\users\jesse\documents\visual studio 2015\projects\mage2d\include\mage\interface\element.h    14

Error   C2143   syntax error: missing ';' before '*'    Mage2D  c:\users\jesse\documents\visual studio 2015\projects\mage2d\include\mage\interface\element.h    14

Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    Mage2D  c:\users\jesse\documents\visual studio 2015\projects\mage2d\include\mage\interface\element.h    14