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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。