erreur: la Classe n'a pas été déclaré en dépit de l'en-tête de l'inclusion, et le code de la compilation d'amende ailleurs
J'ai donc une classe incluse dans une autre classe qui maintient jetant une erreur de compilation de la forme "erreur:" ProblemClass " n'a pas été déclaré. Les fichiers sont mis en place comme ceci:
#ifndef PROBLEMCLASS_H
#define PROBLEMCLASS_H
#include <iostream>
#include <cmath>
class ProblemClass
{
public:
virtual void Init() = 0;
};
#endif
et la classe où l'erreur se produit ressemble à ceci:
#ifndef ACLASS_H
#define ACLASS_H
#include "problemclass.h"
class AClass : public Base
{
public:
void DoSomething(ProblemClass* problem);
};
#endif
L'erreur de compilation se produit à vide Dosomething();
Je suis conscient que le code n'est pas suffisant pour résoudre le problème. J'ai été incapable de créer un exemple minimal qui peut le reproduire. Donc ma question est beaucoup plus général, ce genre de choses pourrait en être la cause? Est-il quelque chose en particulier que je devrais regarder pour, ou de certains de questions que je devrais suivre pour le retrouver?
Ce code compile bien dans à peu près la même version du projet.
Aider de quelque sorte que ce serait grandement apprécié, peu importe la façon vague. J'utilise codeblocks 10.05 avec mingw4.4.1 en win 7 64 bits.
- Vérifiez votre orthographe, de 9 cas sur 10, ces erreurs proviennent parce que vous orthographié l'un des identificateurs de mal.
- J'ai été plus qu'avec un peigne à dents fines, et avait un ami regarde plus trop, donc je pense que l'orthographe est peu être le problème. Ainsi que le fait qu'il compile bien dans une version légèrement différente de ce projet où les deux classes existent et ont la même relation.
- semble ok pour moi. Avez-vous mis en place un corps de DoSomething?
- Pouvez-vous donner le code complet, en particulier la différence entre le cassé et le "presque identique de la version"?
- Le corps de dosomething a été mis en œuvre yep. Fonctionnelle complète de code serait assez grande. Est-il une manière particulière, je devrais le poster d'autres que dans des balises de code?
- Est-il possible que certains autres macro définit
PROBLEMCLASS_H
dans le code qui provoque l'erreur? - Le programme compile après j'ai déménagé des comprend de base et en Classe. Je suis toujours pas sûr de ce qui s'est passé, mais merci à tous pour leur temps.
- Ne
problemclass.h
inclureaclass.h
(directement ou indirectement)? Que serait la cause de ce problème, et peut être résolu par le remplacement de l'un ou des deux#include
s avec la déclaration de la classe(es). - "Le programme compile après j'ai déménagé des comprend de base et en Classe" - Ça comme vous avez eu une dépendance cyclique. De toute façon on le comprend de
ProblemClass
inclusAClass
et quandAClass
comprendProblemClass
le compilateur ignore qui comprennent la déclaration pour éviter une récursion infinie.
Vous devez vous connecter pour publier un commentaire.
Vous semblez dire que le code que tu montre n'est pas réellement produire de l'erreur de compilation que vous avez un problème avec. Donc, nous ne pouvons que deviner. Voici quelques possibilités:
#included
un fichier dans un espace de nomsA
decleration dans un fichier d'en-tête (ce qui est absolument stupide et involontaire), (si on injecte du code dans l'espace de nomsA
) et dans l'unité de traduction de ce code doit être référencé comme Un::gaga(), de sorte que le compilateur complaines de ne pas trouver la fonctiongaga()
!!!J'ai eu le même message d'erreur suite à un dépendance circulaire dans mes fichiers d'en-tête /classes:
foo.hpp:
bar.hpp:
De la compilation avec:
g++ -std=c++11 foo.hpp -o foo
a abouti à la sortie suivante:Veuillez envoyer la commande que vous utilisez pour la compilation. J'ai vu ce problème si vous avez 2 fichiers distincts qui comprennent le même en-tête et que vous faites un gcc *.rpc. Cela se produit parce que le #define est défini pour l'ensemble de la gcc exemple, et pas seulement pour chaque objet, un fichier compilé.
Ex.
Fichier1
Alors deux fichiers distincts qui le référencent.
En essayant de compiler toutes dans le même temps, sera la cause de l'un des fichiers cpp à l'échec depuis FILE1_HPP était déjà défini (provoquant le fichier d'en-tête pour être ignorés pour le fichier cpp).
Réponse est soit supprimer le #ifndef, ou de compiler chaque fichier dans ses propres fichiers de l'objet et de les lier dans votre application principale.
#define
absolument ne devrait pas affecter les autres unités de compilation (moins aussi atteint dans l'autre unité). Si vous pouvez repro, ce serait un bug du compilateur.La seule chose que je pouvais penser à ce que serait la cause de l'erreur de compilation basé sur ce que vous avez présenté est si
PROBLEMCLASS_H
en quelque sorte a été redéfini à l'extérieur de l'en-tête de fichier. Comme par exemple:Une idée que vous pouvez faire est d'essayer de ne pas inclure " problemclass.h' dans 'classe.h', mais juste faire déclarer avant de
ProblemClass
à la place. Pour que cela fonctionne, vous devez vous assurerAClass
définition ne contient que des références ou des pointeurs versProblemClass
-- vous ne voulez pas le compilateur pour essayer de prendre la taille deProblemClass
qui aurait besoin de sa définition complète.Une autre technique que vous pouvez utiliser pour aider à traquer cet en-tête problème est juste de prétraitement de la problématique '."cpp" unité de compilation. Ouvrir la séquence du fichier de sortie(généralement '.i' extension) et d'inspecter ce qui se passe réellement. C'est très pratique surtout si le "comprend", sont nombreux et difficiles à prédire.
J'ai connu un problème similaire et il m'a fallu un certain temps pour savoir pourquoi.
Dans votre cas, vous pouvez définir PROBLEMCLASS_H dans certains autres fichiers d'en-tête.
La conséquence est que votre fichier cpp ignorer la définition dans le fichier d'en-tête. En d'autres termes, la ligne de
#include "problemclass.h"
est ignorée.Dans mon cas, je suis en utilisant MingW64 sous Linux. Dire que j'ai un fichier d'en-tête IO.h:
Dans mon main.cpp fichier:
Le fichier cpp air innocent. Toutefois, lorsque
unistd.h
est inclus, il secrètement comprend/usr/i686-w64-mingw32.static/include/io.h
fourni par MingW, et ceio.h
ressemble:Maintenant, vous pouvez voir que l'inclusion de
unistd.h
conduira à l'inclusionio.h
de MingW, et qui permet de masquer mon propre IO.h. Je suppose que c'est un problème semblable à la vôtre.Si vous changez l'ordre de (mettre
#include <unistd.h>
après IO.h), le programme compile. Mais ce n'est pas une bonne suggestion. Je vous recommande de ne pas utiliser _IO_H_ pour la garde de votre propre IO.h.À comprendre comment/pourquoi votre
PROBLEMCLASS_H
est inclus, je suis d'accord avec @greatwolf, vous pouvez utiliserg++ -E
à la sortie du préprocesseur de sortie manuellement et de les examiner. Vérifiez que les fichiers sont inclus avant votrePROBLEMCLASS_H
et l'ordre dans lequel ils sont inclus. J'espère que peut vous aider à résoudre votre problème.À quelqu'un de voir ce post et d'avoir cette erreur, je tiens à souligner que souvent ce qui m'arrive quand j'ai oublier d'ajouter le spécificateur de classe avant un nom de fonction, caractérisé en ce que la fonction de classe utilise quelque chose de privé définies dans la classe d'en-tête.
Par exemple:
En-tête
Source (Va jeter erreur SomeType_t n'est pas défini)
Source (Fixe)
C'est un idiot, mais vraiment erreur facile à faire et à ne pas voir jusqu'à ce que après que vous avez donné vous-même les trois commotions cérébrales de frapper votre tête contre le bureau.
J'ai eu le même problème et j'ai découvert ce que je faisais de mal: suivant votre exemple, j'ai inclus ProblemClass en Classe, ce qui provoque le problème.