下面这个课程造成了大量的错误。虽然看起来很好。任何知道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);
};
答案 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 ++中双击,应该会带您到相关的行。经常在第一次或第二次错误之后,编译器如此无可救药地混淆,以至于其输出中没有其他内容值得关注。
我怀疑它会带你到你没有显示的那些头文件中的一行。