Qt Creator:“XYZ没有命名类型”

时间:2009-09-14 13:48:41

标签: c++ qt qt-creator

这是Qt Creator中的一个非常令人沮丧的错误消息:’XYZ’ does not name a type。这通常意味着类XYZ中存在一个错误,阻止编译器生成类型,但没有关于出错的其他提示。

有什么建议吗?

11 个答案:

答案 0 :(得分:5)

我刚遇到这个问题,就像 Arckaroph 所说: 问题是,当我们在源代码文件中包含头文件,并且我们在其中使用指令#ifndef时,我们不能再将它包含在头文件中,以便将它的类型包含在源中的变量中代码文件

示例:

class1.h包含Class1 class2.h包含Class2 class2有一个class1类型的私有变量V. 如果我们在class2中包含class1.h。 CPP ,我们不能将它包含在class2.h中,以便为V提供class1类型。

所以我们在class1.h之前放入class2.cpp class2.h 或者我们从class2.cpp中删除class1.h

答案 1 :(得分:3)

abc.cpp xyz.h中,请确保在加入abc.h之前加入{{1}}。

不知道为什么交换这两个会对我产生影响但是它对我有用。

答案 2 :(得分:2)

您是否从编译器或IDE中获得错误(作为一个波浪形的下划线)?我在Qt Creator 1.2.9中遇到过这个问题,我认为这是IDE中的一个错误。

答案 3 :(得分:2)

我相信你正在声明某种类型的XYZ,例如

XYZ foo;

问题是XYZ尚未定义。

以下是我的问题和结论。你觉得怎么样?

我的问题是我有ABC班和XYZ班。 ABC类具有声明为XYZ类型的成员。 XYZ类具有声明为ABC类型的成员。编译器不知道XYZ类型是什么,因为它还没有定义它。因此,给出的错误是'XYZ'没有命名类型。

示例代码:

class ABC{
private:
    XYZ *xyz;   //XYZ is not defined yet
};

class XYZ{
private:
    ABC *abc;   //ABC is defined above
};

答案 4 :(得分:2)

我在qtcreator 3.4.1和QT 5.4上发现了这个问题,当我更换

$id = -1;
$condition = eval('return $id > 0;');
if ($condition)
{
    echo 'true';
}
else
{
    echo 'false';
}

#include <QTextEdit>

这个问题消失了。

答案 5 :(得分:1)

在最近的一个QT项目中,我刚刚安装了最新的QT(2011年3月),我通过添加这个来修复了其中的三个停止我的构建......

#include <sys/types.h>

...在包含抛出错误的头文件之前。这样做了。

我不知道为什么他们会分发那些有这些问题的东西,或许在其他系统中.h.h包含在其他东西中,但不管怎么说都不包括在我的情况下。希望有所帮助。

答案 6 :(得分:0)

#include'相应的头文件有帮助吗?

答案 7 :(得分:0)

如果您正在使用模板,那么您需要在类名称前加上“typename”,以便编译器可以将其识别为类型...

template <typename t> //...

答案 8 :(得分:0)

我有两种可能性:
1.也许你在connect()调用中有SLOT而不是SIGNAL。 2.有时可以对.PRO文件进行无偿编辑(例如插入和删除空格),以便运行QMake并生成.moc文件。

答案 9 :(得分:0)

在我的情况下,我没有使用类定义的命名空间。标题的内容包含在命名空间中,但源文件缺少using namespace指令。

.h

namespace mynamespace {
    class MyClass : public QWidget
    { 
        ...
    }
}

.cpp

using namespace mynamespace

MyClass::MyClass(QWidget *parent) : QWidget(parent)
{
}

答案 10 :(得分:0)

我找到了自己的解决方案。 说我有A班和B班。 “A.h”包括“B.h”并且具有B的成员作为成员。 “B.h”包括“A.h”并且具有A的实例作为成员。 编译器在代码行的“B.h”中给出了一个错误,其中声明了类A的成员:

"A doesn't name type"

我做的是“A.h”我删除#include“B.h”并将#include“B.h”放到“A.cpp”。在A类声明之前,我写了B类;

...
// #include "B.h"
class B;

class A
{
... 
B m_b;
};
...

为我工作,祝你好运!