Code Fix

初級

'const char*' を char に代入したときのエラーの原因

ダブルクォートで囲んだ1文字("A"など)をchar型の変数に代入しようとしたときに出るエラーです。ダブルクォートは何文字であっても文字列(const char*)を作り、char型とは互換性がありません。

エラーメッセージの読み方

main.cpp:3:18: error: invalid conversion from 'const char*' to 'char' [-fpermissive]
main.cpp
ファイル名
3
行番号
18
列番号 — この位置でg++が構文解析に失敗しました
invalid conversion from 'const char*' to 'char' [-fpermissive]
内容 — 期待していたもの、または受け付けられなかったもの

このエラーが出る典型パターン

パターン1

 1  #include <iostream>
 2  int main() {
 3      char grade = "A";
                      ^
 4      std::cout << grade << std::endl;
 5      return 0;
 6  }
main.cpp:3:18: error: invalid conversion from 'const char*' to 'char' [-fpermissive]

"A"は1文字であっても文字列(const char*)です。char型に代入するにはシングルクォートの'A'を使う必要があります。

直し方: "A" を 'A' にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  #include <iostream>
 2  int main() {
 3      char initial = "K";
                        ^
 4      std::cout << initial << std::endl;
 5      return 0;
 6  }
main.cpp:3:20: error: invalid conversion from 'const char*' to 'char' [-fpermissive]

ダブルクォートの文字列はポインタ型なので、char型の変数にそのまま代入することはできません。

直し方: "K" を 'K' にします。

この問題を解いてみる →

パターン3

 1  #include <iostream>
 2  int main() {
 3      char sign = "+";
                     ^
 4      std::cout << sign << std::endl;
 5      return 0;
 6  }
main.cpp:3:17: error: invalid conversion from 'const char*' to 'char' [-fpermissive]

記号1文字であっても、ダブルクォートで囲むと文字列になりchar型には代入できません。

直し方: "+" を '+' にします。

この問題を解いてみる →

パターン4

 1  #include <iostream>
 2  int main() {
 3      char answer = "Y";
                       ^
 4      std::cout << answer << std::endl;
 5      return 0;
 6  }
main.cpp:3:19: error: invalid conversion from 'const char*' to 'char' [-fpermissive]

1文字であってもダブルクォートで囲むと文字列(const char*)になります。char型にはシングルクォートを使います。

直し方: "Y" を 'Y' にします。

この問題を解いてみる →

パターン5

 1  #include <iostream>
 2  int main() {
 3      char op = "*";
                   ^
 4      std::cout << op << std::endl;
 5      return 0;
 6  }
main.cpp:3:15: error: invalid conversion from 'const char*' to 'char' [-fpermissive]

記号1文字でも同じ規則です。演算子の記号を保持したいだけならシングルクォートが必要です。

直し方: "*" を '*' にします。

この問題を解いてみる →

よくある誤解

「1文字だけならダブルクォートでもシングルクォートでも同じ」というのは誤解です。C++では見た目の文字数に関わらず、"A"は文字列(ポインタ)、'A'は文字(整数値)という別の型として扱われます。

実務での勘所

C言語では'A'のような文字定数の型はintですが、C++では最初から明確にchar型と定められています(sizeof('A')は1)。この違いは、C++がCよりも強い型チェックを志向して設計されたことの表れの一つです。'A'をchar型の変数にそのまま代入できるのはこのためで、"A"(const char*型)とは違う型として最初から扱われています。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)