Résolvez le problème « Erreur : le type incomplet n'est pas autorisé » dans le code C++
Au cours du processus de programmation C++, vous rencontrez parfois des erreurs de compilation. L'une des erreurs courantes est « Erreur : le type incomplet n'est pas autorisé ». Cette erreur est généralement provoquée par une opération sur un type incomplet. Cet article expliquera la cause de cette erreur et proposera plusieurs solutions.
Tout d'abord, regardons un exemple de code qui provoque cette erreur :
#include <iostream> class A; class B { public: void foo(A& a) { std::cout << "foo function" << std::endl; } }; class A { public: void bar(B& b) { b.foo(*this); } }; int main() { A a; B b; a.bar(b); return 0; }
Dans cet exemple de code, nous définissons deux classes A et B. Il y a une barre de fonctions membre dans la classe A, et le type de paramètre de cette fonction est B. Une référence, et il existe une fonction membre foo dans la classe B, et le type de paramètre de cette fonction est une référence de A. Dans la fonction principale, nous créons un objet de classe A a et un objet de classe B b, puis appelons la fonction bar de a, en passant b comme paramètre.
Cependant, lorsque nous essayons de compiler ce code, nous obtiendrons le message d'erreur suivant :
error: incomplete type 'A' used in nested name specifier
Cette erreur est causée par l'incapacité du compilateur à déterminer la définition complète de la classe A lors de la compilation de ce code. Étant donné que l'existence de la classe A n'est déclarée que lors de la définition de la classe B, mais que la définition complète de la classe A n'est pas fournie, le compilateur ne peut pas déterminer l'implémentation spécifique des fonctions membres et des variables membres dans la classe A, ce qui entraîne des erreurs de compilation.
Pour résoudre ce problème, nous avons plusieurs méthodes à essayer.
La première méthode consiste à mettre la définition de la classe avant l'endroit où cette classe est utilisée. Nous pouvons échanger la définition de la classe B avec la définition de la classe A, comme indiqué ci-dessous :
class A { public: void bar(B& b); }; class B { public: void foo(A& a) { std::cout << "foo function" << std::endl; } }; void A::bar(B& b) { b.foo(*this); }
En plaçant la définition de la classe B avant la définition de la classe A, le compilateur peut trouver la définition complète de la classe A, résolvant ainsi Compilation erreur.
Une autre façon consiste à utiliser la déclaration anticipée. Nous pouvons faire une déclaration forward en utilisant le mot-clé "class" avant la déclaration de la classe, comme indiqué ci-dessous :
class A; class B { public: void foo(A& a) { std::cout << "foo function" << std::endl; } }; class A { public: void bar(B& b); }; void A::bar(B& b) { b.foo(*this); }
En utilisant la déclaration forward, nous indiquons au compilateur qu'une classe nommée A existe, mais la définition spécifique de la classe Fourni plus tard dans le code. De cette façon, le compilateur peut obtenir les informations de classe A via une déclaration directe, résolvant ainsi les erreurs de compilation.
La dernière méthode consiste à mettre la définition de la classe dans un fichier d'en-tête et à inclure le fichier d'en-tête dans les fichiers qui doivent utiliser cette classe. Par exemple, nous pouvons placer les définitions de la classe A et de la classe B dans deux fichiers d'en-tête "aclass.h" et "bclass.h" respectivement, puis inclure les fichiers d'en-tête correspondants dans les fichiers qui utilisent ces deux classes, comme indiqué ci-dessous. :
Dans le fichier "aclass.h":
#ifndef ACLASS_H #define ACLASS_H class B; class A { public: void bar(B& b); }; #endif
Dans le fichier "bclass.h":
#ifndef BCLASS_H #define BCLASS_H #include <iostream> #include "aclass.h" class B { public: void foo(A& a) { std::cout << "foo function" << std::endl; } }; #endif
Dans les fichiers qui utilisent ces deux classes, utilisez la directive #include pour inclure les fichiers d'en-tête correspondants et utilisez ceci Deux classes, comme indiqué ci-dessous :
#include "aclass.h" #include "bclass.h" int main() { A a; B b; a.bar(b); return 0; }
En mettant la définition de la classe dans le fichier d'en-tête et en incluant le fichier d'en-tête correspondant dans le fichier qui utilise cette classe, nous pouvons utiliser correctement les deux classes du fichier qui doit l'utiliser . Utilisez-les pour résoudre les erreurs de compilation.
Pour résumer, lorsque nous rencontrons l'erreur "erreur : le type incomplet n'est pas autorisé" dans le code C++, nous pouvons mettre la définition de la classe avant l'endroit où cette classe est utilisée, utiliser une déclaration avancée, ou mettre le nom de la classe Mettez la définition dans le fichier d'en-tête pour résoudre ce problème. Ces méthodes peuvent nous aider à utiliser correctement les types incomplets pour éviter cette erreur de compilation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!