错误:ISO C++ 禁止声明没有类型的“对象”

Posted

技术标签:

【中文标题】错误:ISO C++ 禁止声明没有类型的“对象”【英文标题】:error: ISO C++ forbids declaration of 'object' with no type 【发布时间】:2012-02-26 10:25:01 【问题描述】:

我在使用以下代码时遇到问题,我不明白为什么编译器无法识别不同的类型,即使我在声明类 Core 之前定义了它们。 另外,我看不到无限包含循环的可能性。

代码如下:

#ifndef CORE_H
#define CORE_H
#define STAGING

//core
class SqlSaver;
class Indexer;
#include <QLayout>
#include <QMainWindow>
#include <QSplitter>
#include <QStatusBar>
#include <QSystemTrayIcon>

//macros
#include "preprocess.h"

//Interfaces


class PlayListInterface;
class SearchLineInterface;
class MetaDataInterface;
class DriveInterface;
class PlayingInterface;
class ProgressInterface;
class Updater;
class DailySongInterface;
class SystemTrayIcon;
class Playbox;
class EditInterface;

class Core : public QObject

    Q_OBJECT

public:

    Core(QMainWindow*);

    QWidget *initInterfaces();

    MetaDataInterface *metadatainterface();
    //DriveInterface *driveinterface();
    PlayListInterface *playlistinterface();
    SearchLineInterface *searchlineinterface();
    PlayingInterface *playinginterface();
    ProgressInterface *progressinterface();
    Playbox *playbox();
    SystemTrayIcon *systemtrayicon();
    Updater *updater();
    SqlSaver* getSqlControl();
    EditInterface* editinterface();
    void place(float coef);
    void afterLaunch();
    QString getFileContent(const QString& path);

    void setStatus(const QString&);
    QStatusBar* bar();
    void scanFolders();
    QMainWindow* getParent();
    QStringList dictionnary();
    InterfaceName interface() const;

public slots:
    void swapInterface(InterfaceName);


private:

    QWidget *m_central;
    QMainWindow *m_parent;
    QStatusBar* m_bar;
    QStringList m_dictionnary;
    SystemTrayIcon *m_tray;

    SqlSaver *sqlControl;

    PlayListInterface *m_playlistinterface;
    SearchLineInterface *m_searchlineinterface;
    //DriveInterface *m_driveinterface;
    MetaDataInterface *m_metadatainterface;
    PlayingInterface *m_playinginterface;
    ProgressInterface *m_progressinterface;
//    Updater *m_updater;
    BoutonRevenir *m_boutonrevenir;
    Playbox *m_playbox;
    EditInterface *m_editinterface;
    InterfaceName m_interface;

;
#endif

还有编译器输出:

make: Entering directory `/Users/adriencanterot/Projects/compilation'
g++ <...> ../src/mainwindow.cpp
In file included from ../src/mainwindow.cpp:5:
../src/core.h:43: error: ISO C++ forbids declaration of 'MetaDataInterface' with no type
../src/core.h:43: error: expected ';' before '*' token
../src/core.h:47: error: ISO C++ forbids declaration of 'PlayingInterface' with no type
../src/core.h:47: error: expected ';' before '*' token
../src/core.h:48: error: ISO C++ forbids declaration of 'ProgressInterface' with no type
../src/core.h:48: error: expected ';' before '*' token
../src/core.h:49: error: ISO C++ forbids declaration of 'Playbox' with no type
../src/core.h:49: error: expected ';' before '*' token
../src/core.h:82: error: ISO C++ forbids declaration of 'MetaDataInterface' with no type
../src/core.h:82: error: expected ';' before '*' token
../src/core.h:83: error: ISO C++ forbids declaration of 'PlayingInterface' with no type
../src/core.h:83: error: expected ';' before '*' token
../src/core.h:84: error: ISO C++ forbids declaration of 'ProgressInterface' with no type
../src/core.h:84: error: expected ';' before '*' token
../src/core.h:86: error: ISO C++ forbids declaration of 'BoutonRevenir' with no type
../src/core.h:86: error: expected ';' before '*' token
../src/core.h:87: error: ISO C++ forbids declaration of 'Playbox' with no type
../src/core.h:87: error: expected ';' before '*' token
../src/mainwindow.cpp: In constructor 'MainWindow::MainWindow(QWidget*)':
../src/mainwindow.cpp:25: error: 'class Core' has no member named 'metadatainterface'
make: *** [obj/mainwindow.o] Error 1
make: Leaving directory `/Users/adriencanterot/Projects/compilation'

这是 preprocess.h :

#ifndef PREPROCESS_H
#define PREPROCESS_H
#include <QDebug>
#include <QFile>

#define REQUETE(q) QSqlQuery requete; if(!requete.exec(q))  qDebug() << requete.lastError() << " | Q = " << requete.lastQuery(); 
#define QUERY(q) if(!query.exec(q))  qDebug() << query.lastError() << " | \n\nQ = " << query.lastQuery() << "\n\n"; 
#define NB_CHAMPS_DATABASE 14
#ifdef Q_WS_WIN
#define FORMATS_SUPPORTES "*.mp3" << "*.wma" << "*.ogg";
#else
#define FORMATS_SUPPORTES "*.mp3" << "*.m4a" << "*.wma" << "*.ogg";
#endif
#define D(bug) qDebug() << bug;
#define WIDTH_LEFT 200
#define CHAR_NUM_LIST 50
#define RUNNING_WORDS QString("the ");
#define MAX_ELEMENT_SHOWN 500
#ifdef Q_OS_WIN
#define FMOD
#else
#define VLC
#endif

enum ContentType 

    Dir, Playlist, Entire, Playbox, Empty
;

enum ContentTypeForLabel 

    Label, LineEdit, clickableLabel
;

enum InterfaceName 

    PlayingInterface, MetaDataInterface, ProgressInterface
;

enum Action 

    Repeat, Random, Normal
;

enum progressionStyle 
    progression, searching
;

enum insertError 
    AlreadyExists, CantDecodeTag, SqlError, NoError
;

struct ProgressionInfo 
    int progression;
    int maximum;
    QString phrase;
    progressionStyle style;
;
enum searchResultType 
    Song = 0, Artist =1, Album = 2, Nothing = 3
;
enum State
    Playing, Paused, Stopped
;

enum Provenance 
    fromPlaybox, fromPlaylist, fromWeb, fromNowhere
;


#endif // PREPROCESS_H

【问题讨论】:

您是否通过moc 运行您的文件? 您的"preprocess.h" 中有什么内容? 我把preprocess.h的内容加到帖子里了 【参考方案1】:

您对enum 值和class 名称使用相同的标识符。他们发生冲突。

例如,

enum InterfaceName 
    PlayingInterface, MetaDataInterface, ProgressInterface
;

class MetaDataInterface;

这里enumMetaDataInterfaceclass MetaDataInterface 冲突。

如果你想保存命名,但防止冲突,你可以用同名的命名空间包装每个枚举,例如:

namespace InterfaceName 
enum InterfaceName 
    PlayingInterface, MetaDataInterface, ProgressInterface
;
;

class MetaDataInterface;

现在可以参考classlike

MetaDataInterface* i = getInterfaceFromSomeWhere();

enum点赞

InterfaceName::InterfaceName name = InterfaceName::MetaDataInterface;

或者,如果你可以使用c++11,你可以使用class enum

enum class InterfaceName 
    PlayingInterface, MetaDataInterface, ProgressInterface
;

class MetaDataInterface;

//....

MetaDataInterface* i = getInterfaceFromSomeWhere();
InterfaceName name = InterfaceName::MetaDataInterface; //note syntax difference here!

【讨论】:

以上是关于错误:ISO C++ 禁止声明没有类型的“对象”的主要内容,如果未能解决你的问题,请参考以下文章

如何调试“ISO C++ 禁止声明没有类型的‘汽车’”?

ISO C++ 禁止声明没有类型的“堆栈”

ISO C++ 禁止声明没有类型的“myStruct”

ISO C++ 禁止可变大小数组(编译错误)

出现错误:“ISO C++ 禁止指针和整数 [-fpermissive] 之间的比较”如何解决?

Qt错误iso c++禁止指针和整数之间的比较-fpermissive