Ошибка компилятора "символьная константа слишком длинна для ее типа".В чем дело? - PullRequest
10 голосов
/ 03 февраля 2012

У меня есть код, над которым я пытаюсь работать ...

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

Это было адаптировано из написанного мной сценария Bash и является одной из моих первых программ на C ++. Когда я компилирую это, он сталкивается с этими ошибками ...

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’

Не могли бы вы объяснить, что они означают и как их исправить?

РЕДАКТИРОВАТЬ: я получаю новое сообщение об ошибке сейчас ...

.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>

Ответы [ 2 ]

22 голосов
/ 03 февраля 2012

Как уже отмечали другие, вам нужно использовать двойные кавычки ("y" вместо 'y') для ваших строк, в противном случае они являются символьными литералами.

В C / C ++ есть такойвещь как многосимвольный литерал;его значение представляет собой число, состоящее из каким-то образом сложения кодов символов для отдельных символов некоторым образом, определяемым реализацией.Вы не хотите их использовать, если у вас нет действительно веской причины.Единственная причина, по которой вам нужно знать о них, - это понимание предупреждений и сообщений об ошибках:

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

... означает, что нет способа сравнить строку с числом 1919378802, как это делает ваш компиляторинтерпретирует 'hamburger' как среднее.

Как только это будет исправлено, ваше новое сообщение об ошибке:

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

означает, что что-то пошло не так с одним из операторов ||.Возможно, один из его операндов не был логическим выражением.«Примечание» говорит вам, что есть встроенный || для двух bool с, но он не может использоваться в этой ситуации.

Решение : заменитьopt = 'Yes' от opt == "Yes".

Одиночное =, присваивание, означает, что результатом этого выражения является не логическое значение, а строка, и для логического значения operator|| не существует *1026*со строкой.

Стиль Примечание. Обычно считается, что лучше не использовать объявление using namespace std.Вместо этого явно обращайтесь к стандартным библиотечным материалам (cout, endl, string, getline), используя префикс std::, как в std::string.

1 голос
/ 03 февраля 2012

Вы используете одинарные кавычки, чтобы заключить строку. Вам нужно изменить

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

до

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

То же самое относится и к 'Yes' и 'yes', конечно.

Что касается второй проблемы, вы пытаетесь сравнить один символ со строкой. Вы также должны рассматривать 'Y' как строку:

if (opt == "y" || opt == "Y" || opt == "yes" || opt == "Yes")
       //  ^^^ Note the double quotes also on single characters
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...