2009-09-14 7 views
8

Ceci est un message d'erreur très frustrant dans Qt Creator: ’XYZ’ does not name a type. Cela signifie généralement qu'il existe une erreur dans la classe XYZ qui empêche le compilateur de générer le type, mais il n'y a aucune indication supplémentaire sur ce qui s'est passé.Qt Créateur: "XYZ ne nomme pas un type"

Des suggestions?

+0

Pouvez-vous nous montrer la ligne qui cause l'erreur? –

+1

Cela ressemble à un bug dans Qt Creator. Il est toujours là en 2.01. Mon programme compile et fonctionne bien, mais je reçois un tas de messages d'avertissement provenant de types apparemment aléatoires. Même certains types de Qt (comme QScriptValue). – Imbrondir

Répondre

2

J'ai trouvé ce problème sur QtCreator 3.4.1 et QT 5.4, lorsque je remplace cette comme

#include <QTextEdit> 

avec

class QTextEdit; 

ce problème disparu.

0

# inclut-il l'aide du fichier d'en-tête correspondant?

+0

Non, je me suis assuré que je l'ai inclus. –

+0

Pourriez-vous s'il vous plaît poster un exemple complet qui est autonome afin que nous puissions réellement regarder quelque chose? Peut battre deviner :) –

+0

Je ne sais pas quoi chercher ... cela se passe dans un projet avec 100 de fichiers. –

0

Si vous utilisez des modèles, vous devez faire précéder le nom de la classe avec « typename » afin que le compilateur peut le reconnaître comme un type ...

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

Merci, mais pas en utilisant un modèle ... –

2

Avez-vous l'erreur de la compilateur ou l'IDE (comme un soulignement ondulé)? J'ai rencontré cela dans Qt Creator 1.2.9 et je pense que c'est un bug dans l'EDI.

2

Je crois que vous déclarez quelque chose de type XYZ tels que

XYZ foo; 

Le problème est XYZ n'a pas encore été défini.

Ce qui suit est mon problème et ma conclusion. Qu'est-ce que tu penses?

Mon problème est que j'ai une classe ABC et une classe XYZ. La classe ABC a un membre déclaré comme type XYZ. La classe XYZ a un membre déclaré comme type ABC. Le compilateur ne sait pas encore ce qu'est le type XYZ car il ne l'a pas encore défini. Par conséquent, l'erreur indiquée est 'XYZ' ne nomme pas un type.

Exemple de code:

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

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

Dans votre abc.cpp assurez-vous d'inclure xyz.h avant d'inclure abc.h. Je ne sais pas pourquoi échanger les deux autour ferait une différence mais cela a fait pour moi.

0

Deux possibilités s'offrent à moi:
1. Vous avez peut-être SLOT au lieu de SIGNAL dans un appel connect(). 2. Il est parfois utile de modifier gratuitement le fichier .PRO (par exemple, insérer et supprimer un espace), afin que QMake soit exécuté et que les fichiers .moc soient générés.

1

dans un récent projet QT, où je venais d'installer la plus récente QT (3/2011), je guérissait les trois de ces derniers qui faisait escale en ajoutant mon build ... ce

#include <sys/types.h> 

. ..prior à l'inclusion du fichier d'en-tête qui lançait les erreurs. C'est ce qu'il a fait. Je ne sais pas pourquoi ils distribueraient quelque chose qui a eu de tels problèmes, peut-être dans d'autres types de systèmes. H est inclus avec autre chose, mais pas dans mon cas, de toute façon. J'espère que ça aide quelqu'un.

5

Je viens d'avoir ce problème, et comme Arckaroph ai dit: le problème est que lorsque l'on inclut un fichier d'en-tête dans un fichier de code source, et que nous utilisons dans ce la #ifndef, nous ne pouvons pas comprendre nouveau dans un fichier d'en-tête pour donner un type de celui-ci est inclus la classe à une variable dans le fichier de code source

exemple:

class1.h contient Class1 class2.h contient classe2 class2 une variable privée V class1 type si nous incluons class1.h dans class2. CPP nous ne pouvons pas l'inclure dans class2.h pour donner V un type class1.

Nous avons donc mis en class2.cpp class2.h avant class1.h ou nous supprimons class1.h de class2.cpp

0

Dans mon cas, je n'utilisais pas l'espace de noms dans lequel la classe était définie. Le contenu de l'en-tête était contenu dans l'espace de noms, mais la directive using namespace manquait dans le fichier source.

.h:

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

.cpp:

using namespace mynamespace 

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

J'ai trouvé une solution pour moi-même. Disons que j'ai la classe A et la classe B. "A.h" inclut "B.h" et a l'instance de B comme membre. "B.h" inclut "A.h" et a l'instance de A en tant que membre. compilateur me donne une erreur dans « Bh » sur la ligne de code où membre d'une classe est déclarée:

"A doesn't name type" 

Ce que je fais est dans « Ah » je supprimer #include « Bh » et le lieu #include « Bh "à" A.cpp ". Et avant une déclaration de classe, j'écris la classe B;

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

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

J'ai travaillé pour moi, bonne chance!

Questions connexes