首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++编译器问题

C++编译器问题
EN

Stack Overflow用户
提问于 2011-09-02 12:26:19
回答 3查看 91关注 0票数 0

给定以下两个头文件:

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

我得到以下输出:

代码语言:javascript
复制
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

据我所知,我一切都做得很好。我是不是漏掉了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-02 12:33:02

你有一个循环依赖。

window_handler.h包含event_handler.h时,您已经定义了WINDOW_HANDLER_H,但实际上还没有达到定义类的地步。当event_handler.h尝试包含window_handler.h时,由于WINDOW_HANDLER_H的原因,它没有包含

如前所述,您需要在event_handler.h中转发声明,方法是删除window_handler.h的include并将其替换为:

代码语言:javascript
复制
class WindowHandler;
票数 6
EN

Stack Overflow用户

发布于 2011-09-02 12:29:46

在event_handler.h中,删除该行

代码语言:javascript
复制
#include "window_handler.h"

并将其替换为

代码语言:javascript
复制
class WindowHandler;

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

票数 1
EN

Stack Overflow用户

发布于 2011-09-02 12:30:33

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7279230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档