web-dev-qa-db-fra.com

Erreur: constructeur attendu, destructeur ou conversion de type avant ';' jeton?

J'essaie de compiler mon code pour tester une fonction pour lire et imprimer un fichier de données, mais j'obtiens une erreur de compilation que je ne comprends pas - "erreur: constructeur attendu, destructeur ou conversion de type avant ';' jeton". Le mur du code-texte pertinent est ci-dessous.

struct Day
{
  int DayNum;
  int TempMax;
  int TempMin;
  double Precip;
  int TempRange;
};

struct Month
{
  Day Days[31];
  int MonthMaxTemp;
  int MonthMinTemp;
  double TotalPrecip;
  int MonthMaxTempRange;
  int MonthMinTempRange;
  double AverageMaxTemp;
  double AverageMinTemp;
  int RainyDays;
  double AveragePrecip;
}theMonth;

double GetMonth();

double GetMonth()
{
  for (int Today = 1; Today < 31; Today++)
    {
      cout << theMonth.Days[Today].TempMax << theMonth.Days[Today].TempMin;
      cout << theMonth.Days[Today].Precip;
    }
  return 0;
}

GetMonth();  // compile error reported here
17
Owen Pierce

La ligne avec l'erreur semble que vous essayez d'appeler GetMonth - mais au niveau global, un programme C++ se compose d'une série de déclarations. Puisqu'un appel de fonction n'est pas une déclaration, il ne peut pas exister isolément au niveau global. Vous pouvez avoir une déclaration qui est également une définition, auquel cas elle peut appeler une fonction dans le cadre de l'initialisation.

Un appel de fonction en lui-même, cependant, doit être contenu dans une autre fonction:

#ifdef TEST
int main() { 
    GetMonth();
}
#endif
24
Jerry Coffin

(En plus d'autres réponses.) Afin d'exécuter votre fonction 'GetMonth ()', vous devez soit l'appeler à partir d'une autre fonction ('main' ou tout ce qui est appelé à partir de 'main'), soit l'utiliser dans l'expression d'initialisation d'un objet déclaré à la portée de l'espace de noms, comme dans

double global_dummy = GetMonth();

Cependant, cette dernière méthode peut souffrir de problèmes d'ordre d'initialisation, c'est pourquoi il est recommandé d'utiliser l'ancienne méthode dans la mesure du possible.

19
AnT

En C/C++, vous ne pouvez pas simplement ajouter du code exécutable dans le corps d'un en-tête ou d'un fichier d'implémentation (.c, .cpp, .cxx, etc ...). Au lieu de cela, vous devez l'ajouter à une fonction. Si vous souhaitez exécuter le code au démarrage, assurez-vous de l'ajouter à la méthode principale.

int main(int argc, char *argv[]) {
  GetMonth();
}
6
JaredPar

Les programmes C++ ne s'exécutent pas dans un contexte global. Cela signifie que vous devez placer l'appel à GetMonth dans une fonction pour qu'il s'exécute. int main() { } peut être approprié.

3
Andres Jaan Tack