XCode&尽管有适当的包括,但Clang不承认我的一类

时间:2014-02-01 12:50:47

标签: c++ xcode clang

嘿伙计们我有一些课

//
//  renderGUI.h
//  raytracer
//
//  Created by Noah on 24/01/14.
//  Copyright (c) 2014 syx. All rights reserved.
//

#ifndef raytracer_renderGUI
#define raytracer_renderGUI

#include <SFML/Graphics.hpp>
#include <SFGUI/SFGUI.hpp>
#include <renderer.h>

class RenderGUI{

private:
    Renderer* renderer;
    std::shared_ptr<sfg::Window> window;
    std::shared_ptr<sfg::Button> render;
    std::shared_ptr<sfg::Button> abort;
    std::shared_ptr<sfg::ProgressBar> progress;
    std::shared_ptr<sfg::CheckButton> antialiasing;
    void OnComboSelect();
    void startRenderThread();
    void endRenderThread();
    unsigned int renderButtonEvent;

public:
    RenderGUI(Renderer* renderer);
    sfg::Window::Ptr getWindow();
    void update();
    void updateProgressBar(double progress);
    void renderScene();
};


#endif

这里是renderer.h:

//
//  renderer.h
//  raytracer
//
//  Created by Noah on 31/01/14.
//  Copyright (c) 2014 syx. All rights reserved.
//

#ifndef raytracer_renderer
#define raytracer_renderer

#include <scene.h>
#include <thread>

class Renderer{

private:
    sf::Texture* texture;
    sf::Uint8* canvas;
    Vector resolution;

    Scene* scene;
    MaterialManager* materialManager;
    Camera* camera;

    bool canvasReady;
    bool antiAliasing;
    bool canRender;

    double progress;
    std::thread renderThread;

    Color traceRay (const Ray& ray, double, int iter) const;

    void setPixel(int x, int y, Color c);

public:
    Renderer(Scene *scene, MaterialManager *materialManager, Vector resolution, bool antiAliasing);

    sf::Texture* getTexture();
    sf::Uint8* readCanvas();
    double epsilon;
    void update();
    void render();
    void useAntiAliasing(bool antiAliasing);
    bool useAntiAliasing();
    bool isCanvasReady();
    void chooseCamera(Camera* camera);
    void startRenderThread();
    void endRenderThread();
    double getProgress() const;
};

#endif

但是现在我的编译器告诉我“Projects / ETH / ETH / raytracer / raytracer / renderGUI.h:19:5:未知类型名称'渲染器';你的意思是'sfg :: Renderer'?”在第19和31行甚至在我看来它应该找到我的班级......

任何人都可以给我一些提示吗? 提前谢谢!

和平

1 个答案:

答案 0 :(得分:0)

没有看到你的scene.h头文件,我猜测循环包含。 renderGUI.h头文件包含render.h头文件(可能是间接的)包含renderGUI.h

在这种情况下,解决起来很简单:不要在render.h中包含renderGUI.h,只声明Renderer类。

所以renderGUI.h文件看起来像

#ifndef raytracer_renderGUI
#define raytracer_renderGUI

#include <SFML/Graphics.hpp>
#include <SFGUI/SFGUI.hpp>

class Renderer;

class RenderGUI{

private:
    Renderer* renderer;
    ...
};

#endif

这项工作的原因是因为你只在Renderer类的定义中使用RenderGUI指针,所以编译器知道存在名为{{1的类的存在就足够了,编译器不需要知道有关该类的更多信息。

当然,在您实际使用Renderer类的实例(或指向实例的指针)的源文件中,您需要完整的定义,因此您应该包含头文件。