Ошибка компилятора "символьная константа слишком длинная для своего типа". Что случилось?
у меня есть код, над которым я пытаюсь работать...
#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’
не могли бы вы объяснить, что это значит и как их исправить?
EDIT: теперь я получаю новое сообщение об ошибке...
.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 ответов
как указывали другие, вам нужно использовать двойные кавычки ("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
s, но это не может быть использовано в этой ситуации.
решение: заменить opt = 'Yes'
by opt == "Yes"
.
один =
, присваивание, означает, что результатом этого выражения является не bool, а строка, и нет operator||
Для или-ing логическое значение со строкой.
стиль Примечание: обычно считается лучшим стилем не использовать using namespace std
декларации. Вместо этого явно обратитесь к стандартным библиотечным материалам (cout
, endl
, string
, getline
) С помощью std::
префикс, как в std::string
.
вы используете одинарные кавычки заключить строку. Вам нужно изменить
if (choice == 'hamburger' || choice == 'Hamburger')
to
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