C2653:不是没有预编译头文件的类或命名空间

Posted

技术标签:

【中文标题】C2653:不是没有预编译头文件的类或命名空间【英文标题】:C2653: not a class or namespace without precompiled headers 【发布时间】:2012-11-28 18:44:51 【问题描述】:

我正在使用 VisualStudio 2010 使用 Qt 4.8.3 构建一个简单的程序,但我在简单的方法定义方面遇到了问题:

这是我的代码:

GuiHelper.h

#ifndef GUIHELPER_H 
#define GUIHELPER_H

#include "GuiHelper.cpp"
#include <QString>
#include <QWidget>
#include <QFile>

class GuiHelper

private:
static void useStyleSheet(QString, QWidget*);  
;
#endif //GUIHELPER_H

和 GuiHelper.cpp:

#include <QString>
#include <QWidget>
#include <QFile>
#include "GuiHelper.h"

void GuiHelper::useStyleSheet(QString filename, QWidget* widget)

// loads style file and apply style
QFile file(":/Resources/"+filename);
file.open(QFile::ReadOnly);
QString styleSheet = QLatin1String(file.readAll());
widget->setStyleSheet(styleSheet);

我收到错误 C2653: GuiHelper is not a class or a namspace 但我真的看不出有什么问题...

在使用 QT 插件创建项目时,我还检查了“无预编译头文件”

谢谢!

【问题讨论】:

【参考方案1】:

快速修复 - 删除

#include "GuiHelper.cpp"

来自标题。

问题原因:编译器编译源代码 - 即 .cpp 文件。它开始解析cpp文件并到达

#include "GuiHelper.h"

告诉它处理标题并粘贴其内容 - 标题的第二行是

#define GUIHELPER_H

然后,你

#include "GuiHelper.cpp"

依次尝试处理和粘贴cpp 文件,该文件再次尝试处理标头。因为GUIHELPER_H 已经定义,所以不再处理标头,但请记住尚未定义类。所以它到达了这条线

void GuiHelper::useStyleSheet(QString filename, QWidget* widget)

但您会收到错误消息,因为尚未定义 GuiHelper

【讨论】:

@BenoitHnte 作为经验法则,不要在任何地方包含 cpp 文件,除非您正在进行批量构建。

以上是关于C2653:不是没有预编译头文件的类或命名空间的主要内容,如果未能解决你的问题,请参考以下文章

调用opencv时,使用Egien工具出现“error C2061: 语法错误: 标识符“Matrix””和“error C2653: “Eigen”:不是类或命名空间名称”该如何解决?

C2653:“GUI”:不是类或命名空间

尽管编辑了我的包含语句以修复,但得到“错误 C2653:'TextureManager':不是类或命名空间名称”

不是类或命名空间名称

模板实现和编译器

命名空间的作用