导致数千个错误的文件(C ++)

时间:2013-08-01 18:42:17

标签: c++ visual-c++ visual-studio-2012

下面这个课程造成了大量的错误。虽然看起来很好。任何知道VC ++为什么讨厌我的C ++大师?

Entity.h

#pragma once
#include "World.h"
#include "Renderer.h"

class Entity {
public:
    Entity(World* world, Coordinate coord);
    ~Entity();
    void render(Renderer renderer) const;
    World* world;
    Coordinate coord;
};

Entity.cpp

#include "Entity.h"

Entity::Entity(World* world, Coordinate coord) : world(world), coord(coord) {
    world->entities.insert(this);
}

Entity::~Entity() {
    world->entities.erase(this);
}

错误本身并没有多大意义,因为它们甚至与此文件无关。一些常见错误是意外的文件结束,缺少';'在'{'和“Entity不是类或命名空间名称”之前。当我在项目中不包含实体时,不会发生这些错误。最后一个错误出现在Entity的声明代码中。

错误(删除所有重复项):http://pastebin.com/TEMEhVZV

World.h

#pragma once
#include <map>
#include <vector>
#include <unordered_set>
#include "Chunk.h"
#include "Coordinate.h"
#include "Renderer.h"

class World {
public:
    ~World();
    void generateChunk(Coordinate coord);
    void loadChunk(Coordinate coord);
    void renderWorld(Renderer* renderer);
    std::unordered_set<Entity*> entities;
    inline Chunk* getChunk(Coordinate coord) const {
        return loadedChunks.at(coord);
    }
private:
    std::map<Coordinate, Chunk*> loadedChunks;
};

Renderer.h

#pragma once
#include <SFML/Window.hpp>
#include <SFML/OpenGL.hpp>
#include "World.h"

class Renderer {
public:
    sf::Window *window;
    void bind(sf::Window* newWindow);
    void initializeOpenGL();
    void renderChunk(Chunk* chunk);
    inline void drawPoint(Coordinate coord) {
        glBegin(GL_POINTS);
        glVertex3d(coord.x, coord.y, coord.z);
        glEnd();
    }
private:
    template <class T>
    inline static void pushVector3(std::vector<T>* vertices, T x, T y, T z);
};

3 个答案:

答案 0 :(得分:3)

对我来说,它看起来像一个循环的头依赖,意味着无法定义。

如果您的Renderer.h文件有一个作用于Entity对象的方法,并且包含此头文件作为依赖项,则必须在编译Entity之前声明Renderer 。 (编译器需要知道Entity对象的大小,以便对堆栈偏移进行硬编码。)

但同样地,Renderer需要Entity。所以它也无法编译!

之前可能没有在您的项目中显示,因为当“实体”标题触发它们时,头文件的加载顺序与现在不同。

所以,你应该做的是修改标题,这样就没有循环依赖关系,然后只引用标题中的指针,因为它们具有固定的已知大小。以下是一些技巧:

包括低级别课程而不是高级课程。

 #include "World.h" 
 --> 
 #include "Coordinate.h"
 class World;

使用指针。

#include "Renderer.h" 
void render(Renderer renderer) const;
 --> 
 class Renderer;
 void render(Renderer* renderer) const;

执行这些操作后,可以将头文件移动到.cpp文件中:

#include "Entity.h"
#include "World.h" 
#include "Renderer.h" 

答案 1 :(得分:0)

没有更多背景,很难提供太多帮助。根据我的经验,这样的错误几乎总是与丢失的分号有关。您是否获得了包含这些错误的文件和行号?我会检查Renderer.h,并确保它没有丢失分号。

我建议这样做的原因是,当你#include一个文件时,编译器实际上将它复制到这个文件中。这意味着以前文件中的拼写错误可以在这些文件中显示出来。如果您可以发布更多信息,甚至自己复制和粘贴错误,我会尝试提供更多帮助。

编辑: 由于您发布了错误,因此更有意义。如果你看,列表中的第一个错误实际上是数字148.你必须向下滚动错误编号1:

  

“错误1错误C2065:'实体':未声明的标识符world.h”

对我来说,这看起来像是在尝试在文件world.h中使用类Entity,但它还不存在。所以这看起来像一个循环包含问题。

答案 2 :(得分:0)

尝试将其吐出的第一个错误解决,并修复该错误。在VC ++中双击,应该会带您到相关的行。经常在第一次或第二次错误之后,编译器如此无可救药地混淆,以至于其输出中没有其他内容值得关注。

我怀疑它会带你到你没有显示的那些头文件中的一行。

相关问题