Code Fix

中級

error: invalid conversion from 'int*' to 'int' の原因と直し方

アドレス演算子&で得たポインタを、参照や普通の変数と混同して代入しようとしたときに出るエラーです。&xはint*型であり、int型の変数にそのまま代入することはできません。

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

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

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

パターン1

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

&xはint*型(xのアドレス)です。int型の変数にそのまま代入することはできません。ここでは単に値をコピーしたいだけなので&は不要です。

直し方: &(空) にします。

この問題を解いてみる →

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

パターン2

 1  #include <iostream>
 2  int main() {
 3      int score = 90;
 4      int copy = & score;
                    ^
 5      std::cout << copy << std::endl;
 6      return 0;
 7  }
main.cpp:4:16: error: invalid conversion from 'int*' to 'int' [-fpermissive]

「参照を使えばアドレスが取れる」という思い込みから&を付けてしまうミスです。値をコピーするだけなら&は要りません。

直し方: &(空) にします。

この問題を解いてみる →

パターン3

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

g++は「possible fix: dereference with '*'」とも提案しますが、それは*totalにすればポインタの中身が読めるという意味で、今回のように単純代入したい場合は&自体を消すのが正しい直し方です。

直し方: &(空) にします。

この問題を解いてみる →

よくある誤解

「参照もポインタも結局アドレスを扱うものだから同じ」というのは誤解です。参照(int&)は既存の変数の別名であり、宣言時に&を書きますが、それは「アドレスを代入する」のではなく「参照として初期化する」という別の文法です。

まとめ

error: invalid conversion from 'int*' to 'int'は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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