Pregunta

Este es un mensaje de error muy frustrante en Qt Creator: & # 8217; XYZ & # 8217; no nombra un tipo . 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.

¿Alguna sugerencia?

¿Fue útil?

Solución

Encontré este problema en qtcreator 3.4.1 y QT 5.4, cuando lo reemplazo como

#include <QTextEdit>

con

class QTextEdit;

este problema desapareció.

Otros consejos

Acabo de tener este problema, y ??como Arckaroph he dicho: el problema es que cuando incluimos un archivo de encabezado en un archivo de código fuente, y usamos en él la directiva #ifndef, no podemos incluirlo nuevamente en un archivo de encabezado para dar un tipo de clase incluida a una variable en fuente archivo de código

ejemplo:

class1.h contiene Class1 class2.h contiene Class2 class2 tiene una variable privada V con tipo class1 si incluimos class1.h en class2. CPP no podemos incluirlo en class2.h para darle a V un tipo class1.

así que ponemos en class2.cpp class2.h antes de class1.h o eliminamos class1.h de class2.cpp

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

No tengo idea de por qué intercambiar los dos cambiaría la situación como lo hizo para mí.

¿Obtiene el error del compilador o del IDE (como un subrayado ondulado)? He encontrado esto en Qt Creator 1.2.9 y creo que es un error en el IDE.

Creo que estás declarando algo del tipo XYZ como

XYZ foo;

El problema es que XYZ aún no está definido.

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

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 cuál es el tipo XYZ porque aún no lo ha definido. Por lo tanto, el error dado es 'XYZ' no nombra un tipo.

Código de ejemplo:

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

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

en un proyecto QT reciente, donde acababa de instalar el QT más reciente (3/2011), curé los tres que estaban deteniendo mi compilación al agregar esto ...

#include <sys/types.h>

... antes de incluir el archivo de encabezado que arrojaba los errores. Eso lo hizo.

No sé por qué distribuirían algo que tenía tales problemas, tal vez en otros tipos de sistemas. h está incluido con otra cosa, pero no en mi caso, de todos modos. Espero que ayude a alguien.

¿Ayuda # incluir el archivo de encabezado correspondiente?

Si está utilizando plantillas, debe preceder el nombre de la clase con " typename " para que el compilador pueda reconocerlo como un tipo ...

template <typename t> //...

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

En mi caso, no estaba usando el espacio de nombres en el que se definió la clase. El contenido del encabezado estaba contenido 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)
{
}

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

"A doesn't name type"

Lo que hago es en "A.h" Elimino #include " B.h " y colocar #include " B.h " a "A.cpp". Y antes de la declaración de clase A escribo clase B;

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

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

Trabajó para mí, ¡buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top