error: 'x' was not declared in this scope の原因と直し方
宣言していない変数を使ったときに出るエラーです。多くの場合はタイプミスで、g++は似た名前の宣言済み変数があれば「did you mean 'total'?」のように候補を提案してくれます。
エラーメッセージの読み方
main.cpp:4:18: error: 'toal' was not declared in this scope; did you mean 'total'?
main.cpp- ファイル名
4- 行番号
18- 列番号 — この位置でg++が構文解析に失敗しました
'toal' was not declared in this scope; did you mean 'total'?- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 #include <iostream> 2 int main() { 3 int total = 5; 4 std::cout << toal << std::endl; ^ 5 return 0; 6 }
totalとtoalは文字が入れ替わっただけの別名です。g++は似た名前の宣言済み変数を見つけると「did you mean」で提案してくれますが、実際に直すのは自分です。
直し方: toal を total にします。
パターン2
1 #include <iostream> 2 int main() { 3 int score = 90; 4 std::cout << scroe << std::endl; ^ 5 return 0; 6 }
scoreのタイプミスであるscroeという名前は宣言されていないため、コンパイラは未知の識別子として扱います。
直し方: scroe を score にします。
パターン3
1 #include <iostream> 2 int main() { 3 int width = 10; 4 int height = 20; 5 std::cout << (width * hight ) << std::endl; ^ 6 return 0; 7 }
heightをhightと書き間違えると、コンパイラはそのような名前を知らないため即座にエラーにします。
直し方: hight を height にします。
パターン4
1 #include <iostream> 2 int main() { 3 int price = 100; 4 std::cout << pric << std::endl; ^ 5 return 0; 6 }
priceのタイプミスであるpricは宣言されていないため、コンパイラは未知の識別子として扱います。
直し方: pric を price にします。
パターン5
1 #include <iostream> 2 int main() { 3 int count = 7; 4 std::cout << coutn << std::endl; ^ 5 return 0; 6 }
文字の並びを間違えただけでも、宣言済みの名前とは完全に別物として扱われます。
直し方: coutn を count にします。
よくある誤解
「コンパイラが賢く直してくれる」わけではありません。提案(did you mean)はあくまでヒントであり、実際にコードを書き換えるのは自分です。提案された名前が意図と違う変数であるケースもあります。
実務での勘所
did you meanという提案は、その時点でコンパイラがすでに認識している名前の中からしか選ばれません。つまり、必要なヘッダをインクルードし忘れていて、そもそもその名前自体をコンパイラがまだ一度も見ていない場合は、似た名前が実在してもこの提案には出てきません。提案が出ない、あるいは全く見当違いの候補しか出ないときは、タイプミスではなくヘッダのインクルード忘れを疑う合図です。