it-swarm.com.de

Compilerfehler "Zeichenkonstante zu lang für den Typ". Was ist falsch?

Ich habe einen Code, an dem ich arbeite ...

#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.";
      }
  }
}

Dies wurde von einem Bash-Skript, das ich geschrieben habe, übernommen und ist eines meiner ersten C++ - Programme. Wenn ich das kompiliere, kommt es mit diesen Fehlern ...

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’

Können Sie erklären, was diese bedeuten und wie Sie sie beheben können?

EDIT: Ich bekomme jetzt eine neue Fehlermeldung ...

.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

Wie bereits erwähnt, müssen Sie für Ihre Zeichenfolgen doppelte Anführungszeichen ("y" anstelle von 'y') verwenden, andernfalls handelt es sich um Zeichenliterale.

In C/C++ gibt es so etwas wie ein aus mehreren Zeichen bestehendes Literal. Sein Wert ist eine Zahl, die aus der Zusammenstellung der Zeichencodes für die einzelnen Zeichen in einer implementierungsdefinierten Weise besteht. Sie möchten sie niemals verwenden, es sei denn, Sie haben einen wirklich guten Grund. Der einzige Grund, den Sie darüber wissen müssen, ist das Verstehen der Warnungen und Fehlermeldungen:

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

... bedeutet, dass es keine Möglichkeit gibt, einen String mit der Nummer 1919378802 zu vergleichen. Dies bedeutet, dass Ihr Compiler 'hamburger' so interpretiert.

Sobald dies behoben ist, wird Ihre neue Fehlermeldung angezeigt:

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

bedeutet, dass bei einem der ||-Operatoren ein Fehler aufgetreten ist. Vielleicht war einer seiner Operanden kein boolescher Ausdruck. Die "Notiz" weist Sie darauf hin, dass für bools ein || eingebaut ist, der in dieser Situation jedoch nicht verwendet werden kann.

Lösung: Ersetzen Sie opt = 'Yes' durch opt == "Yes".

Die einfache Zuweisung von = bedeutet, dass das Ergebnis dieses Ausdrucks kein Bool ist, sondern eine Zeichenfolge, und es gibt keine operator|| für die Erstellung eines booleschen Objekts mit einer Zeichenfolge.

Stil Hinweis: Es wird normalerweise als besser angesehen, keine using namespace std-Deklaration zu verwenden. Verweisen Sie stattdessen explizit auf Standardbibliothek (cout, endl, string, getline), indem Sie ein std::-Präfix verwenden, wie in std::string.

22
wolfgang

Sie verwenden einfache Anführungszeichen, um eine Zeichenfolge einzufügen. Du musst dich ändern 

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

zu

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

Dasselbe gilt natürlich für 'Yes' und 'yes'.

Beim zweiten Problem versuchen Sie, ein einzelnes Zeichen mit einer Zeichenfolge zu vergleichen. Sie müssen Ihren 'Y' auch als Zeichenfolge betrachten:

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