【问题标题】:C2039: Class is not a member of NamespaceC2039:类不是命名空间的成员
【发布时间】:2015-06-13 21:31:07
【问题描述】:

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();
        };
    }
}

Mage/Interface/Element.h

#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);
        };
    }
}

这给了我以下错误:

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

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

【问题讨论】:

    标签: c++


    【解决方案1】:

    你有一个循环依赖。 Element.h 包含 Context.h,而 Context.h 包含 Element.h,那是行不通的。

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

    【讨论】:

    • 谢谢。从字面上看,这是有史以来最无用的编译器错误;你会认为打印关于循环依赖的消息很容易。
    • 并非如此。循环依赖只是您的设计问题。编译器问题是它报告的问题。你可以有循环依赖,尽管你需要以不同的方式处理它们。您还没有看到字面上无益的消息。
    • @luk32:在我听说过一些关于无用编译器错误的恐怖故事之后,我准备好相信你了。您可能是对的,我倾向于过分热心地将类拆分为单独的文件。
    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多