碰到过几次这类问题,但是那时也不知道是怎么弄好的,最近在一些帖子,找到了办法,
就是在头文件里,将include "xxx.h"文件注释掉,换成声明,在.cpp文件里使用include "xxx.h"。
具体参考:
http://stackoverflow.com/questions/7199809/expected-class-name-before-token
http://stackoverflow.com/questions/3632818/forward-declaration-vs-include
文件1 cbase.h
#define CBASE_H
#include <QObject>
#include "ctree.h"
class CBase : public QObject
{
Q_OBJECT
public:
explicit CBase(QObject *parent = 0);
CTree * tree;
signals:
public slots:
};
#endif // CBASE_H
文件2 cmain.h
#define CMAIN_H
#include <QObject>
#include "cbase.h"
class CMain : public CBase
{
Q_OBJECT
public:
explicit CMain(QObject *parent = 0);
signals:
public slots:
};
#endif // CMAIN_H
文件3 ctree.h
#define CTREE_H
#include <QObject>
#include "cbase.h"
#include "cmain.h"
class CTree : public QObject
{
Q_OBJECT
public:
explicit CTree(QObject *parent = 0);
CBase * bs;
CMain * mnt;
signals:
public slots:
};
#endif // CTREE_H
便以结果:
In file included from ctree.h:6:0,
from cbase.h:5,
from cbase.cpp:1:
cmain.h:8:1: error: expected class-name before ‘{’ token
多个文件相互嵌套包含时,会提示:expected class-name before ‘{’ token,
有时即使头文件里添加了#ifndef XX #define XX;还是没用,
解决方法:在文件3 ctree.h添加类说明
class CBase;
class CMain;
,注释掉include
#ifndef CTREE_H
#define CTREE_H
#include <QObject>
//#include "cbase.h"
//#include "cmain.h"
class CBase;
class CMain;
class CTree : public QObject
{
Q_OBJECT
public:
explicit CTree(QObject *parent = 0);
CBase * bs;
CMain * mnt;
signals:
public slots:
};
#endif // CTREE_H