web-dev-qa-db-fra.com

Erreur du compilateur "constante de caractère trop longue pour son type". Qu'est-ce qui ne va pas?

J'ai du code sur lequel j'essaye de travailler ...

#include <iostream>
#include <string>

int main()
{
  std::cout << "Hello. Welcome to Delicious Drive Up. What would you like to order?\n";
  std::cout << "\nOur menu is-";
  std::cout << "...";
  std::cout << "\nOrder here > ";
  std::string choice;
  std::getline(cin, choice);
  if (choice == 'hamburger' || choice == 'Hamburger')
  {
      std::cout << "We don't have any ham. Is a Chickenburger all right? y/n. > ";
      std::string opt;
      std::getline(cin, opt);
      if (opt == 'y' || opt == 'Y' || opt == 'yes' || opt = 'Yes')
      {
          std::cout << "Here's your chickenburger.";
      }
  }
}

Ceci a été adapté d'un script Bash que j'ai écrit et est l'un de mes premiers programmes C++. Quand je compile cela, il arrive avec ces erreurs ...

test.cpp:19:15: warning: character constant too long for its type
test.cpp:19:40: warning: character constant too long for its type
test.cpp:23:44: warning: multi-character character constant
test.cpp:23:59: warning: multi-character character constant
test.cpp: In function ‘int main()’:
test.cpp:19: error: no match for ‘operator==’ in ‘choice == 1919378802’
test.cpp:19: error: no match for ‘operator==’ in ‘choice == 1919378802’
test.cpp:23: error: no match for ‘operator==’ in ‘opt == 'y'’
test.cpp:23: error: no match for ‘operator==’ in ‘opt == 'Y'’
test.cpp:23: error: no match for ‘operator==’ in ‘opt == 7955827’

Pourriez-vous expliquer ce que cela signifie et comment les réparer?

EDIT: Je reçois un nouveau message d'erreur maintenant ...

.test.cpp: In function ‘int main()’:
.test.cpp:23: error: no match for ‘operator||’ in ‘((std::operator== [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& opt))), ((const char*)"y")) || std::operator== [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& opt))), ((const char*)"Y"))) || std::operator== [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& opt))), ((const char*)"yes"))) || opt’
.test.cpp:23: note: candidates are: operator||(bool, bool) <built-in>
10
CoffeeRain

Comme d'autres l'ont fait remarquer, vous devez utiliser des guillemets ("y" au lieu de 'y') pour vos chaînes, sinon ce sont des littéraux de caractères.

En C/C++, il existe un littéral à plusieurs caractères. sa valeur est un nombre consistant à rassembler les codes de caractères des caractères individuels d'une manière définie par la mise en oeuvre. Vous ne voulez jamais les utiliser à moins d'avoir une très bonne raison. La seule raison pour laquelle vous devez savoir à leur sujet est de comprendre les avertissements et les messages d'erreur:

test.cpp:19: error: no match for ‘operator==’ in ‘choice == 1919378802’

... signifie qu'il n'y a aucun moyen de comparer une chaîne avec le nombre 1919378802, ce que votre compilateur interprète par 'hamburger'.

Une fois que cela est corrigé, votre nouveau message d'erreur:

.test.cpp:23: error: no match for ‘operator||’ in ...
.test.cpp:23: note: candidates are: operator||(bool, bool) <built-in>

signifie que quelque chose s'est mal passé avec l'un des opérateurs ||. Peut-être que l'un de ses opérandes n'était pas réellement une expression booléenne. La "note" vous indique qu'il existe un || intégré pour deux bools, mais qu'il ne peut pas être utilisé dans cette situation.

Solution: Remplacez opt = 'Yes' par opt == "Yes".

L'affectation unique =, signifie que le résultat de cette expression n'est pas un bool, mais une chaîne, et il n'y a pas de operator|| pour orner un booléen avec une chaîne.

Remarque sur le style: il est généralement considéré comme meilleur de ne pas utiliser une déclaration using namespace std. À la place, faites explicitement référence aux éléments de la bibliothèque standard (cout, endl, string, getline) en utilisant un préfixe std::, comme dans std::string.

22
wolfgang

Vous utilisez des guillemets simples pour entourer une chaîne. Vous devez changer 

if (choice == 'hamburger' || choice == 'Hamburger')

à

if (choice == "hamburger" || choice == "Hamburger")

La même chose s'applique à 'Yes' et 'yes', bien sûr.

En ce qui concerne le deuxième problème, vous essayez de comparer un seul caractère avec une chaîne. Vous devez également considérer votre 'Y' comme une chaîne:

if (opt == "y" || opt == "Y" || opt == "yes" || opt == "Yes")
       //  ^^^ Note the double quotes also on single characters
1
Pietro Lorefice