Problèmes:
- aucune protection d'inclusion multiples
- inclusion cyclique
- utilisation de type avant sa déclaration provoquée par l'inclusion cyclique
Votre foo.h en cours de traitement par le préprocesseur C ressemble à une séquence de chaînes vide infinie.
avec de multiples protection d'inclusion foo.h est prétraité à:
> cpp foo.h
class bar{ // preprocessed from #include "bar.h"
public:
static const int MY_DEFINE = 10;
foo::my_enum_type var;
bar() {};
~bar() {};
};
// end of #include "bar.h"
class foo{
public:
enum my_enum_type { ONE, TWO, THREE };
foo();
~foo() {}
};
Ceci est évidemment pas un code C++ valide - foo est utilisé dans le corps de bar sans déclaration préalable. C++, contrairement à Java, nécessite que les types soient déclarés avant utilisation.
- Utiliser une protection d'inclusion multiple. Selon votre plate-forme, ceux-ci peuvent être des macros
#ifndef
ou #pragma once
des directives
- Supprimer l'inclusion de bar.h de foo.h.
- Placez les déclarations anticipées si nécessaire (dans votre cas,
bar
peut être déclaré dans foo.h, votre exemple ne révèle cependant pas la nécésité).
- Déplacer autant d'implémentation que possible vers les fichiers * .cpp.
Si la situation ne peut pas être résolue avec ces recommandations, utilisez PIMPL idiom.
En bref - il suffit de retirer #include "bar.h"
directive de foo.h
Cela devrait fonctionner correctement ... –
Comment utilisez-vous les classes? Vous n'avez pas encore de fichier source ici. Pouvez-vous partager comme vous utilisez ces classes? –
Merci les gars, vous me faites réaliser que le problème n'était pas la syntaxe, mais comment j'ai utilisé les classes. Il y avait un #include "bar.h" dans foo.h, je l'ai remplacé par une déclaration avant et tout va bien maintenant! –