编译器错误“字符常量对于其类型来说太长”。怎么了?

时间:2012-02-03 14:23:50

标签: c++ compiler-errors operators

我有一些我正在尝试的代码...

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

3 个答案:

答案 0 :(得分:22)

正如其他人所指出的那样,你需要为你的字符串使用双引号("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>

表示其中一个||运算符出错。也许它的一个操作数实际上并不是一个布尔表达式。 &#34;注意&#34;告诉您,两个||内置bool,但在这种情况下无法使用。

解决方案:将opt = 'Yes'替换为opt == "Yes"

=,赋值,意味着该表达式的结果不是bool而是字符串,并且没有operator||用于或者带有字符串的布尔值。

样式注意:不使用using namespace std声明通常被认为是更好的样式。相反,使用cout前缀明确引用标准库内容(endlstringgetlinestd::),如std::string中所述。

答案 1 :(得分:1)

您使用单引号括起字符串。你需要改变

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

答案 2 :(得分:1)

您使用单引号将字符串引起来。

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

将其更改为双引号。

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

单引号用于定义单字符,双引号用于定义字符串文字。