1. ホーム
  2. c++

[解決済み] コンパイラーエラー "character constant too long for its type". 何が問題なのでしょうか?

2022-01-28 23:39:45

質問内容

私はいくつかのコードに取り組んでいます...。

#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++プログラムの1つです。これをコンパイルすると、こんなエラーが出るんです...。

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>

解決方法は?

他の方が指摘されているように、ダブルクォート( "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>

のいずれかに何か問題があったことを意味します。 || 演算子です。オペランドの1つが実際にはブール式でなかったのかもしれません。注釈" は、組み込みの || に対して、2つの bool が、この場面では使えないと。

解決方法 : 置き換え opt = 'Yes' によって opt == "Yes" .

シングル = は、その式の結果がboolではなく文字列であることを意味し、また、その式には operator|| ブーリアンと文字列の論理和をとるため。

スタイルノート: 通常は using namespace std を宣言します。その代わり、標準ライブラリのものを明示的に参照する ( cout , endl , string , getline を使用しています)。 std:: のように、プレフィックスを付けます。 std::string .