J'ai un modèle d'inclusion comme suit: « « Class1_namespace » ne désigne pas un type »problème Inclusion
/*
* Class1.h
*/
#ifndef CLASS1_H_
#define CLASS1_H_
#include "Class2.h"
namespace Class1_namespace
{
class Class1
{
Class2* Class2_ptr;
void Class1_member()
{
(*Class2_ptr).Class2_method();
}
};
}
#endif /* CLASS1_H_ */
/*
* Class2.h
*/
#ifndef CLASS2_H_
#define CLASS2_H_
#include "Class1.h"
class Class2
{
Class1_namespace::Class1 Class2_data;
public:
void Class2_method(){};
};
#endif /* CLASS2_H_ */
/*
* main.cpp
*/
#include "Class1.h"
int main()
{
return 0;
}
Cependant, cela conduit à l'erreur
Est-ce une erreur provoquée par l'ordre de mes inclusions?
Quelles sont les solutions possibles? Je suis douteux au sujet des déclarations anticipées résolvant mon problème.
L'inclusion mutuelle est-elle toujours à éviter ou juste quand les déclarations anticipées suffisent? – user383352
L'inclusion mutuelle est un symptôme des dépendances cycliques, qui devraient être évitées si possible. Si vous devez avoir la dépendance cyclique, elle ne peut être traitée que si l'un des types peut être déclaré en avant. Sinon, vous ne serez pas en mesure de compiler votre code. –
Si vous pensez à ce que fait vraiment le #include, vous verrez pourquoi il ne pourrait pas fonctionner comme vous l'avez fait. Le but du préprocesseur est de produire un fichier unique qui est ensuite compilé. Le compilateur fait un seul passage à travers ce fichier, donc tout ce qui est nécessaire pour une classe doit venir avant. Exécutez votre paramètre de compilateur pour juste pré-traiter et regarder le fichier de résultat - vous verrez qu'il est impossible de le compiler sous ces contraintes. –