简体   繁体   English

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

[英]error: ISO C++ forbids declaration of 'object' with no type

I'm having trouble with the following code, I don't understand why the compiler doesn't recognise the different types even though I defined them before the declaration of the class Core. 我遇到以下代码时遇到问题,我不明白为什么编译器不能识别不同的类型,即使我在类Core的声明之前定义了它们。 Plus I don't see the possibility of an infinite include loop. 另外,我没有看到无限包含循环的可能性。

Here's the code : 这是代码:

#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

And there's the compiler output : 还有编译器输出:

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'

And Here's preprocess.h : 这是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

You use same identifiers both for enum values and class names. 您对enum值和class名使用相同的标识符。 They clash. 他们发生冲突。

For example, 例如,

enum InterfaceName {
    PlayingInterface, MetaDataInterface, ProgressInterface
};

and

class MetaDataInterface;

Here enum value MetaDataInterface conflicts with class MetaDataInterface . 这里enumMetaDataInterfaceclass MetaDataInterface冲突。

If you want save naming, but prvent conflicts, you can wrap every enum with namespace with same name, for example: 如果要保存命名,但是要防止冲突,可以使用相同名称的命名空间包装每个枚举,例如:

namespace InterfaceName {
enum InterfaceName {
    PlayingInterface, MetaDataInterface, ProgressInterface
};
};

class MetaDataInterface;

Now you can refer to class like 现在你可以参考class

MetaDataInterface* i = getInterfaceFromSomeWhere();

and to enum like enum一样

InterfaceName::InterfaceName name = InterfaceName::MetaDataInterface;

Or, if you can use c++11 , you can use class enum : 或者,如果您可以使用c++11 ,则可以使用class enum

enum class InterfaceName {
    PlayingInterface, MetaDataInterface, ProgressInterface
};

class MetaDataInterface;

//....

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM