Maison >développement back-end >C++ >Erreur de compilation C++ : les types locaux ne sont pas autorisés comme paramètres de modèle, comment y remédier ?

Erreur de compilation C++ : les types locaux ne sont pas autorisés comme paramètres de modèle, comment y remédier ?

PHPz
PHPzoriginal
2023-08-21 21:39:221571parcourir

Lors de l'écriture de code C++, vous rencontrerez parfois des erreurs de compilation telles que « les types locaux ne sont pas autorisés comme paramètres de modèle ». Cela signifie généralement que nous utilisons un type local dans un paramètre de modèle, tel qu'une classe ou un type de structure défini dans une fonction. Dans cet article, nous aborderons ce problème et comment le résoudre.

Tout d’abord, voyons pourquoi cette erreur de compilation se produit. En C++, les paramètres de modèle doivent être résolus au moment de la compilation, tandis que la définition du type local a lieu au moment de l'exécution. Par conséquent, les types locaux ne peuvent pas être utilisés comme paramètres de modèle car le compilateur ne sait pas comment les analyser.

Donnez un exemple pour illustrer ce problème :

#include <iostream>

template <typename T>
void printSize(const T& arg){
   struct localStruct {
      int i;
   }myLocalStruct;   //定义了一个局部结构体类型

   std::cout << "Size of arg = "<<sizeof(arg)<<"
";
   std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<"
";
}

int main() {
   int x = 5;
   printSize(x);
   return 0;
}

Dans le code ci-dessus, nous définissons une fonction modèle printSize, qui reçoit un paramètre arg. Nous définissons également un type de structure locale myLocalStruct et utilisons sizeof pour en obtenir la taille et le paramètre arg.

Lorsque nous compilons ce code, nous obtenons un message d'erreur : "Les types locaux ne sont pas autorisés comme paramètres de modèle".

Pour résoudre ce problème, nous devons convertir le type local en type global. Nous pouvons déplacer la définition de type local en dehors de la fonction ou la définir comme type membre de la classe.

Voyons comment nous pouvons corriger le code ci-dessus en utilisant des types globaux :

#include <iostream>

struct localStruct {
   int i;
};   //将局部结构体类型定义为全局

template <typename T>
void printSize(const T& arg){
   localStruct myLocalStruct;

   std::cout << "Size of arg = "<<sizeof(arg)<<"
";
   std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<"
";
}

int main() {
   int x = 5;
   printSize(x);
   return 0;
}

Maintenant, nous avons déplacé la définition de la structure locale en dehors de la fonction. Le correctif est compilé et exécuté avec succès, et le résultat est correct.

En plus de convertir les types locaux en types globaux, une autre solution consiste à définir le type local comme type membre de la classe. Cette approche nécessite du code supplémentaire, mais est parfois plus pratique :

#include <iostream>

template <typename T>
class myClass{
public:
   struct localStruct {
      int i;
   };

   void printSize(const T& arg){
      localStruct myLocalStruct;

      std::cout << "Size of arg = "<<sizeof(arg)<<"
";
      std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<"
";
   }
};

int main() {
   int x = 5;
   myClass<int> obj;
   obj.printSize(x);
   return 0;
}

Dans le code ci-dessus, nous définissons le type de structure locale comme type de membre de myClass. Ce correctif se compile et s'exécute également avec succès et génère les résultats corrects.

Pour résumer, lorsque nous rencontrons une erreur de compilation de « les types locaux ne sont pas autorisés comme paramètres de modèle » lors de l'utilisation de modèles C++, nous devons convertir le type local en un type global ou un type membre de la classe. Ces correctifs peuvent résoudre ce problème avec succès.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn