错误: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;
这里enum
值MetaDataInterface
与class MetaDataInterface
冲突。
如果你想保存命名,但防止冲突,你可以用同名的命名空间包装每个枚举,例如:
namespace InterfaceName
enum InterfaceName
PlayingInterface, MetaDataInterface, ProgressInterface
;
;
class MetaDataInterface;
现在可以参考class
like
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++ 禁止声明没有类型的“对象”的主要内容,如果未能解决你的问题,请参考以下文章