error: expected class-name before ‘{’ token
来源:互联网 发布:搜索引擎优化bwysj 编辑:程序博客网 时间:2024/06/09 16:36
I know there are a couple of similar questions(circular include) out stackoverflow and other websites. But I still can't figure it out and no solutions pop out. So I would like to post my specific one.
I have a Event class who has 2 and actually more subclass, which are Arrival and Landing. The compiler(g++) complains:
g++ -c -Wall -g -DDEBUG Event.cpp -o Event.oIn file included from Event.h:15, from Event.cpp:8:Landing.h:13: error: expected class-name before ‘{’ tokenmake: *** [Event.o] Error 1
People said that it's a circular include. The 3 header files(Event.h Arrival.h Landing.h) are as follows:
the Event.h:
#ifndef EVENT_H_#define EVENT_H_#include "common.h"#include "Item.h"#include "Flight.h"#include "Landing.h"class Arrival;class Event : public Item {public: Event(Flight* flight, int time); virtual ~Event(); virtual void occur() = 0; virtual string extraInfo() = 0; // extra info for each concrete event // @implement int compareTo(Comparable* b); void print();protected: /************** this is why I wanna include Landing.h *******************/ Landing* createNewLanding(Arrival* arrival); // return a Landing obj based on arrival's infoprivate: Flight* flight; int time; // when this event occurs};#endif /* EVENT_H_ */
Arrival.h:
#ifndef ARRIVAL_H_#define ARRIVAL_H_#include "Event.h"class Arrival: public Event {public: Arrival(Flight* flight, int time); virtual ~Arrival(); void occur(); string extraInfo();};#endif /* ARRIVAL_H_ */
Landing.h
#ifndef LANDING_H_#define LANDING_H_#include "Event.h"class Landing: public Event {/************** g++ complains here ****************/public: static const int PERMISSION_TIME; Landing(Flight* flight, int time); virtual ~Landing(); void occur(); string extraInfo();};#endif /* LANDING_H_ */
UPDATE:
I included Landing.h due to Landing's constructor is called in the Event::createNewLanding method:
Landing* Event::createNewLanding(Arrival* arrival) { return new Landing(flight, time + Landing::PERMISSION_TIME);}
3 Answers
Replace
#include "Landing.h"
with
class Landing;
If you still get errors, also post Item.h
, Flight.h
and common.h
EDIT: In response to comment.
You will need to e.g. #include "Landing.h"
from Event.cpp
in order to actually use the class. You just cannot include it from Event.h
#include
the needed header files in your .cpp not your .h – Erik Mar 16 '11 at 1:23Type *
orType &
)- in addition to avoiding such circular include problems, this reduces interdependencies in between files, which a.o. reduces compile time. – Erik Mar 16 '11 at 1:34If you forward-declare Flight
and Landing
in Event.h
, then you should be fixed.
Remember to #include "Flight.h"
and #include "Landing.h"
in your implementation file forEvent
.
The general rule of thumb is: if you derive from it, or compose from it, or use it by value, the compiler must know its full definition at the time of declaration. If you compose from a pointer-to-it, the compiler will know how big a pointer is. Similarly, if you pass a reference to it, the compiler will know how big the reference is, too.
#include <privateheader.h>
is generally incorrect - Use "privateheader.h"
– Erik Mar 16 '11 at 1:14This should be a comment, but comments don't allow multi-line code.
Here's what's happening:
in Event.cpp #include "Event.h"
preprocessor starts processing Event.h
#ifndef EVENT_H_
it isn't defined yet, so keep going
#define EVENT_H_#include "common.h"
common.h
gets processed ok
#include "Item.h"
Item.h
gets processed ok
#include "Flight.h"
Flight.h
gets processed ok
#include "Landing.h"
preprocessor starts processing Landing.h
#ifndef LANDING_H_
not defined yet, keep going
#define LANDING_H_#include "Event.h"
preprocessor starts processing Event.h
#ifndef EVENT_H_
This IS defined already, the whole rest of the file gets skipped. Continuing with Landing.h
class Landing: public Event {
The preprocessor doesn't care about this, but the compiler goes "WTH is Event
? I haven't heard aboutEvent
yet."
Not the answer you're looking for? Browse other questions tagged c++ g++ or ask your own question.
- error: expected class-name before '{' token
- error: expected class-name before '{' token
- error: expected class-name before ‘{’ token
- error: expected class-name before '{' token
- error: expected class-name before '{' token
- error: expected class-name before '{' token
- expected class-name before '{' token
- expected class-name before '{' token .
- expected class-name before ‘{’ token
- gcc 编译错误 error:expected class-name before ';' token
- 错误:error: expected class-name before '{' token解决方法
- error: expected class-name before '{' token 【已解决】
- 错误:expected class-name before ‘{’ token
- error: expected template-name before '<' token
- error: expected ')' before '*' token
- g++报错原因分析:expected class-name before ‘{’ token
- [Error] expected expression before '%' token
- error: expected initializer before ‘&’ token
- 平平庸庸非本心
- android应用程序的安装和卸载
- LightOJ 1388 Trapezium Drawing
- 使用CGLIB实现AOP功能与AOP概念解释
- 快速排序,好像不是很懂
- error: expected class-name before ‘{’ token
- 关掉Ctrl+Alt+↓(方向键)转屏功能
- 透析WINCE的控制面板
- CF 254B(日期)
- source insight的配置
- 杭电OJ题 1040 As Easy As A+B 解题报告
- Tabular: 在 Vim 中对齐文本
- 详解WINCE的控制面板
- linux input 设备的测试函数
Landing.h
(on line 13). Why did you put a comment inEvent.h
saying the error was there? – Ben Voigt Mar 16 '11 at 1:13