2009-09-14 15 views
8

Questo è un messaggio di errore molto frustrante in Qt Creator: ’XYZ’ does not name a type. Questo di solito significa che c'è un errore nella classe XYZ che impedisce al compilatore di generare il tipo, ma non ci sono ulteriori suggerimenti su cosa è andato storto.Qt Creator: "XYZ non nomina un tipo"

Qualche suggerimento?

+0

Puoi mostrarci la riga che causa l'errore? –

+1

Sembra un bug in Qt Creator. È ancora lì in 2,01. Il mio programma si compila e funziona bene, ma ricevo un sacco di messaggi di avvertimento da tipi apparentemente casuali. Anche alcuni tipi di Qt (come QScriptValue). – Imbrondir

risposta

2

ho trovato questo problema su QtCreator 3.4.1 e QT 5.4, quando sostituisco tale come

#include <QTextEdit> 

con

class QTextEdit; 

questo problema andato.

0

# include l'aiuto del file di intestazione corrispondente?

+0

No, mi sono assicurato di averlo incluso. –

+0

Potresti pubblicare un esempio completo che sia autonomo in modo da poter effettivamente guardare qualcosa? Può battere a indovinare :) –

+0

Non so cosa cercare ... questo sta accadendo in un progetto con centinaia di file. –

0

Se stai usando modelli, allora avete bisogno di precedere il nome della classe con "TypeName" in modo che il compilatore può riconoscere come un tipo ...

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

Grazie, ma non utilizzando un modello ... –

2

si ottiene l'errore dal compilatore o IDE (come una sottolineatura ondulata)? Ho incontrato questo in Qt Creator 1.2.9 e penso che sia un bug nell'IDE.

2

Credo si dichiara qualcosa di tipo XYZ come

XYZ foo; 

Il problema è XYZ non è ancora definita.

Quanto segue è il mio problema e la mia conclusione. Cosa ne pensi?

Il mio problema è che ho una classe ABC e una classe XYZ. La classe ABC ha un membro dichiarato come tipo XYZ. La classe XYZ ha un membro dichiarato come tipo ABC. Il compilatore non sa ancora quale sia il tipo XYZ perché non lo ha ancora definito. Di conseguenza, l'errore indicato è "XYZ" non indica un tipo.

Esempio di codice:

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

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

Nella tua abc.cpp Assicurati di includere xyz.h prima di includere abc.h.

Non ho idea del motivo per cui scambiare i due in giro farebbe la differenza, ma lo ha fatto per me.

0

Mi si presentano due possibilità:
1. Probabilmente si dispone di SLOT al posto di SIGNAL in una chiamata connect(). 2. A volte è utile apportare una modifica gratuita al file .PRO (ad esempio, inserire ed eliminare uno spazio), in modo che QMake venga eseguito e vengano generati i file .moc.

1

in un recente progetto di QT, dove avevo appena installato il più recente QT (3/2011), ho curato i tre di questi che si sarebbe fermato la mia generazione aggiungendo questo ...

#include <sys/types.h> 

. ..prior per l'inclusione del file di intestazione che stava lanciando gli errori. Questo è stato.

Non so perché distribuissero qualcosa che aveva tali problemi, forse in altri tipi di sistemi.h è incluso con qualcos'altro, ma non nel mio caso, comunque. Spero che aiuti qualcuno.

5

Ho appena avuto questo problema, e come Arckaroph detto: il problema è che quando includiamo un file di intestazione in un file di codice sorgente, e usiamo in essa la direttiva #ifndef, non possiamo includere di nuovo in un file di intestazione per dare un tipo di classe è inclusa in una variabile nel file di codice sorgente

esempio:

class1.h contiene Class1 class2.h contiene Class2 class2 avere una variabile V privato con class1 type se includiamo class1.h in class2. CPP non possiamo includerlo in class2.h per dare a V un tipo di classe1.

così abbiamo messo in class2.cpp class2.h prima class1.h o cancelliamo class1.h da class2.cpp

0

Nel mio caso non stavo utilizzando lo spazio dei nomi in cui è stata definita la classe. I contenuti dell'intestazione erano contenuti nello spazio dei nomi, ma il file di origine mancava della direttiva using namespace.

.h:

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

.cpp:

using namespace mynamespace 

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

ho trovato una soluzione per me. Dire che ho classe A e classe B. "A.h" include "B.h" e ha l'istanza di B come membro. "B.h" include "A.h" e ha l'istanza di A come membro. compilatore mi dà un errore in "Bh" sulla riga di codice in cui viene dichiarato membro della classe A:

"A doesn't name type" 

Quello che faccio è in "Ah" rimuovo # include "Bh" e luogo #include "Bh "a" A.cpp ". E prima di una dichiarazione di classe scrivo la classe B;

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

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

Ha funzionato per me, buona fortuna!