2012-02-26 2 views
0

У меня возникают проблемы со следующим кодом, я не понимаю, почему компилятор не распознает разные типы, даже если я определил их перед объявлением класс Core. Плюс я не вижу возможности бесконечного цикла включения.ошибка: 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

+1

Что находится в вашем 'preprocess.h?'? – Lol4t0

+0

Я добавил содержимое preprocess.h к сообщению – acanterot

ответ

3

Вы можете использовать одинаковые идентификаторы как для enum значений и class имена. Они сталкиваются.

Например,

enum InterfaceName { 
    PlayingInterface, MetaDataInterface, ProgressInterface 
}; 

и

class MetaDataInterface; 

Здесь enum значение MetaDataInterface конфликты с class MetaDataInterface.

Если вы хотите сохранить именование, но prvent конфликты, вы можете обернуть каждое перечисление с пространством имен с таким же именем, например:

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

class MetaDataInterface; 

Теперь вы можете обратиться к class как

MetaDataInterface* i = getInterfaceFromSomeWhere(); 

и чтобы enum как

InterfaceName::InterfaceName name = InterfaceName::MetaDataInterface; 

Или, если вы можете использовать, вы можете использовать class enum:

enum class InterfaceName { 
    PlayingInterface, MetaDataInterface, ProgressInterface 
}; 

class MetaDataInterface; 

//.... 

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

или использовал C++ 11 'enum en! – rubenvb

+0

@rubenvb, спасибо, я добавил к сообщению – Lol4t0

+0

спасибо, что это помогло! – acanterot

Смежные вопросы