2012-02-03 29 views
6

que tienen un código que estoy tratando de trabajar en ...Error del compilador "carácter constante demasiado largo para su tipo". ¿Qué pasa?

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

Este fue adaptado de un script Bash que escribí y es uno de mis primeros programas en C++. Cuando compilo esto, se trata con estos errores ...

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’ 

Podría explicar lo que significan y cómo solucionarlos?

EDIT: me sale un mensaje de error nuevo ahora ...

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

Solo para aclararlo, C++ no es un lenguaje de scripting, por lo tanto, esto no es en realidad un script. –

+0

Los errores serían más útiles si supiéramos * dónde * realmente es la línea 19, etc. No parece ser igual a los números de línea en el código, lo que me lleva a la suposición de que ha modificado el código antes de publicarlo. –

+0

@NiklasR ¿Podría explicarlo? Además, no dije que era. Dije que era un programa. ¿Eso también está mal? – CoffeeRain

Respuesta

18

Como otros han señalado, es necesario utilizar comillas dobles ("y" en lugar de 'y') para sus cadenas, de lo contrario son caracteres literales.

En C/C++, existe un literal de caracteres múltiples; su valor es un número compuesto de alguna manera al juntar los códigos de los caracteres individuales de alguna manera definida por la implementación. No querrás usarlos a menos que tengas una muy buena razón. Ellos única razón por lo que necesita saber acerca de ellos es entender las advertencias y mensajes de error:

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

... significa que no hay manera de comparar una cadena con el número 1919378802, que es lo que interpreta el compilador 'hamburger' significar.

Una vez que se fija, el nuevo mensaje de error:

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

significa que algo salió mal con uno de los operadores ||. Tal vez uno de sus operandos no era realmente una expresión booleana. La "nota" le dice que hay un || incorporado para dos bool s, pero que no se pudo usar en esta situación.

Solución: Reemplace opt = 'Yes' por opt == "Yes".

El único =, asignación, significa que el resultado de esa expresión no es un bool sino una cadena, y no hay operator|| para or-ing boolean con una cadena.

Estilo Nota: Por lo general, se considera un mejor estilo para no utilizar una declaración using namespace std.En su lugar, explícitamente consulte las cosas estándar de la biblioteca (cout, endl, string, getline) usando un prefijo std::, como en std::string.

+0

Gracias! Acabo de llegar con la misma respuesta en el chat de C++ – CoffeeRain

+0

¡Gracias por tan buena respuesta! – 0x6900

1

estás usando comillas simples para delimitar una cadena. Es necesario cambiar

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

a

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

Lo mismo se aplica a 'Yes' y 'yes', por supuesto.

En cuanto al segundo problema, está tratando de comparar un solo carácter con una cadena. Es necesario tener en cuenta su 'Y' como una cadena demasiado:

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

¡Gracias! Realmente soy una persona de Python, así que siempre pongo cadenas en comillas simples. – CoffeeRain

+1

Espero que tengas una muy buena razón para intentar enseñarte C++, entonces. –

+0

Por favor, lea mi edición. – CoffeeRain

Cuestiones relacionadas