Qt Creator: «XYZ не называет тип» - PullRequest
8 голосов
/ 14 сентября 2009

Это очень расстраивающее сообщение об ошибке в Qt Creator: ’XYZ’ does not name a type. Обычно это означает, что в классе XYZ есть ошибка, которая не позволяет компилятору сгенерировать тип, но нет никаких дополнительных подсказок относительно того, что пошло не так.

Есть предложения?

Ответы [ 11 ]

5 голосов
/ 16 августа 2011

У меня просто была эта проблема, и, как Аркароф сказал: проблема в том, что когда мы включаем файл заголовка в файл исходного кода и используем в нем директиву #ifndef, мы не можем снова включить его в файл заголовка, чтобы дать тип включаемого класса переменной в исходном коде файл кода

пример:

class1.h содержит Class1 class2.h содержит Class2 class2 имеет закрытую переменную V с типом class1 если мы включим class1.h в class2. CPP , мы не сможем включить его в class2.h, чтобы придать V тип class1.

поэтому мы помещаем в class2.cpp class2.h перед class1.h или мы удаляем class1.h из class2.cpp

3 голосов
/ 09 февраля 2011

В вашем abc.cpp убедитесь, что вы включили xyz.h, прежде чем включить abc.h.

Понятия не имею, почему обмен этими двумя изменится, но для меня это имело место.

2 голосов
/ 14 июня 2015

Я обнаружил эту проблему на qtcreator 3.4.1 и QT 5.4, когда я заменяю, например,

#include <QTextEdit>

с

class QTextEdit;

эта проблема исчезла.

2 голосов
/ 06 ноября 2010

Я полагаю, вы объявляете что-то типа 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
};
2 голосов
/ 15 сентября 2009

Вы получаете сообщение об ошибке от компилятора или IDE (как подчеркнуто волнистое)? Я сталкивался с этим в Qt Creator 1.2.9 и думаю, что это ошибка в IDE.

1 голос
/ 31 марта 2011

в недавнем проекте QT, где я только что установил самый последний QT (3/2011), я вылечил три из них, которые останавливали мою сборку, добавив это ...

#include <sys/types.h>

... до включения файла заголовка, который выдавал ошибки. Это сделал это.

Я не знаю, почему они распространяли что-то, что имело такие проблемы, возможно, в других типах систем. H включено с чем-то другим, но в любом случае не в моем случае. Надеюсь, это кому-нибудь поможет.

0 голосов
/ 15 февраля 2018

Я нашел решение для себя. Скажем, у меня есть класс А и класс Б. «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;
};
...

Работал на меня, Удачи!

0 голосов
/ 18 июля 2016

В моем случае я не использовал пространство имен, в котором был определен класс. Содержимое заголовка содержалось в пространстве имен, но в исходном файле отсутствовала директива using namespace.

.h:

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

.cpp

using namespace mynamespace

MyClass::MyClass(QWidget *parent) : QWidget(parent)
{
}
0 голосов
/ 09 февраля 2011

Мне представляются две возможности:
1. Возможно, у вас есть SLOT вместо SIGNAL в вызове connect (). 2. Иногда это помогает сделать произвольное редактирование файла .PRO (например, вставить и удалить пробел), чтобы запустить QMake и сгенерировать файлы .moc.

0 голосов
/ 14 сентября 2009

Если вы используете шаблоны, то перед именем класса нужно указать «typename», чтобы компилятор мог распознать его как тип ...

template <typename t> //...
...