2012-02-26 91 views
0

我遇到以下代码有问题,我不明白为什么编译器不能识别不同的类型,即使我在声明之前定义了它们核心类。 另外我没有看到无限循环的可能性。错误:ISO C++禁止声明'对象'没有类型

下面的代码:

#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 
+0

你有没有运行过'moc'您的文件? – spencercw 2012-02-26 10:28:41

+1

你的''preprocess.h“'中有什么? – Lol4t0 2012-02-26 10:51:03

+0

我将postprocess.h的内容添加到了帖子 – acanterot 2012-02-26 13:39:58

回答

3

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

例如,

enum InterfaceName { 
    PlayingInterface, MetaDataInterface, ProgressInterface 
}; 

class MetaDataInterface; 

这里enumMetaDataInterface冲突与class MetaDataInterface

如果你想保存的命名,但prvent冲突,你可以换用相同的名字命名每一个枚举,例如:

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

class MetaDataInterface; 

现在,您可以参考class

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! 
+0

或者使用C++ 11'class enum'! – rubenvb 2012-02-26 17:04:59

+0

@rubenvb,谢谢,我添加到帖子 – Lol4t0 2012-02-26 17:18:46

+0

感谢它帮助了很多! – acanterot 2012-02-27 09:19:44

相关问题