Que signifie «avertissement: tous les chemins de contrôle ne renvoient pas de valeur»? (C ++)

L’avertissement exact que je reçois est

warning C4715: 'hand::show' : not all control paths return a value 

et hand :: show est

 std::ostream& hand::show(std::ostream& os) const { if(side == left) { return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4]; } if(side == right) { return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0]; } } 

où side est une variable de type orientation

 orientation{ left = -1, right = 1 }; 

Que signifie l’avertissement et quelle serait la meilleure solution pour s’en débarrasser?

Votre compilateur n’est pas assez intelligent pour prendre en compte le fait que les deux seules options pour side sont left et right , il pense donc qu’il est possible qu’aucune instruction return ne soit exécutée. Quand side n’est ni à left ni à right , votre fonction ne dit pas quelle valeur renvoyer.

L’erreur signifie que si side n’est ni à gauche ni à droite, votre fonction ne renverra pas de valeur – aucun des côtés n’est déclaré de manière incorrecte ou votre enum l’est. Un enum devrait être défini comme

 enum orientation {left, right}; 

Alors essayez de changer votre structure d’orientation pour cela.

Si side n’est ni à left ni à right , la valeur de retour n’est pas définie.

Même si l’ orientation est une énumération avec seulement deux valeurs (pour le moment), elle peut toujours avoir une valeur différente pour l’une des raisons suivantes:

  • Dans le futur, vous pouvez changer l’en-tête pour inclure d’autres valeurs dans l’énumération. La programmation défensive suppose donc que cela se produira (et votre compilateur est gentil et vous avertit maintenant).
  • side peut être non initialisé, donc il ne peut être ni à left ni à right
  • side peut avoir été atsortingbuée à side via la conversion de type, par exemple *((int*)&side) = 2

Les solutions possibles incluent:

  • Remplacez le second par un else comme suggéré par qc.
  • Changez-le pour être:

     if(side == left) { return ...; } else if(side == right) { return ...; } else { ...handle error... } 

L’avertissement signifie qu’il est possible de passer par votre méthode sans renvoyer de valeur explicite. Avec votre code:

 std::ostream& hand::show(std::ostream& os) const { if(side == left) { return os< 

si side != left et side != right , vous ne retournez rien. Une façon courante de résoudre ce problème est de supposer, par exemple, que si ce n'est pas "à gauche", on suppose toujours "à droite":

 std::ostream& hand::show(std::ostream& os) const { if(side == left) { return os< 

Vous pouvez faire ce que vous avez dit, ou, puisque dans ce cas, vous retournez vraiment la même chose de toute façon …

 std::ostream& hand::show(std::ostream& os) const { if(side == left) { os< 

Pour se débarrasser de l’avertissement, remplacez le deuxième if par un else :

 std::ostream& hand::show(std::ostream& os) const { if(side == left) { return os< 

Comme le suggèrent d’autres personnes, le problème est que votre side n’est peut-être ni à left ni à right .
Vous pouvez modifier votre fonction pour effectuer l’une des opérations suivantes:

  1. remplacez la deuxième instruction if par une autre, ou supprimez la condition dans son ensemble, car si le côté n’est pas laissé, il doit être correct.
  2. suivez la suggestion de Nathaniel Flath et modifiez le type d’orientation en enum.
  3. déclenche une exception en tant que dernière déclaration de la fonction.