C ++编译器问题

时间:2011-09-02 04:26:19

标签: c++ compiler-errors

给出以下两个头文件:

#ifndef EVENT_HANDLER_H
#define EVENT_HANDLER_H

#include <SFML/Window.hpp>
#include <SFML/Window/Event.hpp>
#include "window_handler.h"

class EventHandler
{
public:
    EventHandler(WindowHandler & classOwner);

    WindowHandler * m_windowHandler;

private:
    bool m_leftKeyDown;
    bool m_rightKeyDown;
    bool m_upKeyDown;
    bool m_downKeyDown;

    unsigned int m_mouseX;
    unsigned int m_mouseY;

};

#endif

AND

#ifndef WINDOW_HANDLER_H
#define WINDOW_HANDLER_H

#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include "event_handler.h"

class WindowHandler
{
public:
    WindowHandler();
    sf::Window m_app;

private:
    EventHandler m_eventHandler;
};
#endif

我得到以下输出:

In file included from window_handler.h:6:0,
                 from main.cpp:3:
event_handler.h:13:29: error: expected ‘)’ before ‘&’ token
event_handler.h:15:2: error: ‘WindowHandler’ does not name a type

据我所知,我做的一切都很完美。我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:6)

你有一个循环依赖。

window_handler.h包含event_handler.h时,您已定义WINDOW_HANDLER_H,但实际上尚未达到定义类的位置。当event_handler.h尝试包含window_handler.h时,由于WINDOW_HANDLER_H

而不包括event_handler.h

如上所述,您需要通过移除window_handler.h的包含并将其替换为class WindowHandler; 来转发{{1}}中的声明。

{{1}}

答案 1 :(得分:1)

在event_handler.h中,删除行

#include "window_handler.h"

并将其替换为

class WindowHandler;

这里的问题是您的包含列表中有一个循环。因此,由于包含保护,您将拥有一个尝试使用未定义的WindowHandler或未定义的EventHandler的文件。看看预处理器输出,这应该更有意义。

答案 2 :(得分:1)

您的标头具有包含的循环依赖关系。根据您的需要,您可以将其中一个更改为前向声明,或者您必须创建包含所需公共代码的第三个标头。