2009-09-14 10 views
8

Este es un mensaje de error muy frustrante en Qt Creator: ’XYZ’ does not name a type. Esto generalmente significa que hay un error en la clase XYZ que impide que el compilador genere el tipo, pero no hay pistas adicionales sobre lo que salió mal.Creador de Qt: "XYZ no nombra un tipo"

¿Alguna sugerencia?

+0

¿Puede mostrarnos la línea que causa el error? –

+1

Parece un error en Qt Creator. Todavía está ahí en 2.01. Mi programa compila y funciona bien, pero recibo un montón de mensajes de advertencia de tipos aparentemente aleatorios. Incluso algunos tipos de Qt (como QScriptValue). – Imbrondir

Respuesta

2

me encontré con este problema en QtCreator 3.4.1 y QT 5.4, cuando sustituyo tales como

#include <QTextEdit> 

con

class QTextEdit; 

este problema ha ido.

0

¿Incluye # include'ing el archivo de cabecera correspondiente?

+0

No, me aseguré de haberlo incluido. –

+0

¿Podría publicar un ejemplo completo que sea autónomo para que podamos ver algo? Puede vencer las conjeturas :) –

+0

No sé qué buscar ... esto está sucediendo en un proyecto con cientos de archivos. –

0

Si está utilizando plantillas, entonces usted necesita para preceder al nombre de la clase con el "nombre de tipo" para que el compilador puede reconocer como un tipo ...

template <typename t> //... 
+0

Gracias, pero no usando una plantilla ... –

2

se obtiene el error de la compilador o el IDE (como un subrayado ondulante)? Me he encontrado con esto en Qt Creator 1.2.9 y creo que es un error en el IDE.

2

Creo que se está declarando algo del tipo XYZ como

XYZ foo; 

El problema es XYZ aún no está definida.

El siguiente es mi problema y mi conclusión. ¿Qué piensas?

Mi problema es que tengo una clase ABC y una clase XYZ. La clase ABC tiene un miembro que se declara como un tipo XYZ. La clase XYZ tiene un miembro que se declara como un tipo ABC. El compilador aún no sabe qué tipo de XYZ es porque aún no lo ha definido. Por lo tanto, el error dado es 'XYZ' no nombra un tipo.

Código Ejemplo:

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

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

En su abc.cpp asegúrese de incluir xyz.h antes de incluir abc.h.

No tengo idea de por qué intercambiar las dos podría hacer la diferencia, sin embargo, lo hizo para mí.

0

Se me ocurren dos posibilidades:
1. Quizás tenga SLOT en lugar de SIGNAL en una llamada a connect(). 2. Algunas veces resulta útil realizar una edición gratuita del archivo .PRO (por ejemplo, insertar y eliminar un espacio), de modo que QMake se ejecute y se generen los archivos .moc.

1

en un proyecto de QT reciente, en que sólo había instalado el último cuarto de galón (3/2011), que curaba a los tres de estos que detenía mi construcción mediante la adición de este ...

#include <sys/types.h> 

. ..prior al include del archivo de encabezado que arrojaba los errores. Eso lo hizo.

No sé por qué iban a distribuir algo que tenía tales problemas, quizás en otros tipos de sistemas.h se incluye con otra cosa, pero no en mi caso, de todos modos. Espero que ayude a alguien.

5

sólo tenía este problema, y ​​al igual que Arckaroph he dicho: el problema es que cuando se incluye un archivo de cabecera en un archivo de código fuente, y usamos en ella el #ifndef Directiva, no podemos incluir de nuevo en un archivo de cabecera para dar un tipo de clase que está incluido en una variable en el archivo de código fuente

ejemplo:

class1.h contiene clase 1 clase 2 class2.h contiene clase2 tener una variable privada con V class1 escriba si incluimos class1.h en class2. CPP no podemos incluirlo en class2.h para dar a V un tipo de clase 1.

por lo que ponemos en class2.h class2.cpp antes class1.h o borramos class1.h de class2.cpp

0

En mi caso, no estaba usando el espacio de nombres en el que se definía la clase. El contenido del encabezado estaba dentro del espacio de nombres, pero al archivo fuente le faltaba la directiva using namespace.

.h:

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

.cpp:

using namespace mynamespace 

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

he encontrado una solución para mí. Digamos que tengo clase A y clase B. "A.h" incluye "B.h" y tiene una instancia de B como miembro. "B.h" incluye "A.h" y tiene instancia de A como miembro. compilador me da un error en "BH" en la línea de código donde se declara miembro de la clase A:

"A doesn't name type" 

Lo que sí está en "Ah" elimino # include "Bh" y el lugar # include "Bh "a" A.cpp ". Y antes de una declaración de clase escribo clase B;

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

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

¡Trabajó para mí, buena suerte!

Cuestiones relacionadas