error: expected ';' after class definition の原因と直し方
クラス定義の閉じ波括弧}の後にセミコロンを書き忘れたときに出るエラーです。C++特有の落とし穴で、if文や関数定義の}にはセミコロンは要りませんが、クラスや構造体の定義には必要です。
エラーメッセージの読み方
main.cpp:5:2: error: expected ';' after class definition
main.cpp- ファイル名
5- 行番号
2- 列番号 — この位置でg++が構文解析に失敗しました
expected ';' after class definition- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 #include <iostream> 2 class Point { 3 public: 4 int x; 5 } ^ 6 int main() { 7 Point p; 8 p.x = 1; 9 std::cout << p.x << std::endl; 10 return 0; 11 }
if文や関数定義の}にはセミコロンは要りませんが、クラス定義は文の一種として扱われ、末尾に;が必要です。
直し方: (空) を ; にします。
パターン2
1 #include <iostream> 2 class Box { 3 public: 4 int size; 5 } ^ 6 int main() { 7 Box b; 8 b.size = 5; 9 std::cout << b.size << std::endl; 10 return 0; 11 }
クラス定義の}のあとに何も書かず次のコードが続くと、コンパイラはそこにセミコロンが無いことをエラーとして報告します。
直し方: (空) を ; にします。
パターン3
1 #include <iostream> 2 class Car { 3 public: 4 int speed; 5 } ^ 6 int main() { 7 Car c; 8 c.speed = 60; 9 std::cout << c.speed << std::endl; 10 return 0; 11 }
C言語には無いC++特有のルールなので、C言語の経験があるとかえって見落としやすいミスです。
直し方: (空) を ; にします。
パターン4
1 #include <iostream> 2 class Item { 3 public: 4 int qty; 5 } ^ 6 int main() { 7 Item i; 8 i.qty = 3; 9 std::cout << i.qty << std::endl; 10 return 0; 11 }
クラス定義は文の一種として扱われるため、末尾の}のあとにセミコロンが必要です。
直し方: (空) を ; にします。
パターン5
1 #include <iostream> 2 class Note { 3 public: 4 int id; 5 } ^ 6 int main() { 7 Note n; 8 n.id = 7; 9 std::cout << n.id << std::endl; 10 return 0; 11 }
クラス定義の}のあとに何も書かないと、コンパイラはセミコロンが無いことをエラーとして報告します。
直し方: (空) を ; にします。
よくある誤解
「波括弧で閉じるブロックはどれも同じルール」というのは誤解です。クラス・構造体・共用体・列挙型の定義は文の一種として扱われ、末尾にセミコロンが必要です。一方、関数定義やif/forなどの制御構文の}にはセミコロンは不要です。
実務での勘所
セミコロンが必要な理由をより深く理解するには、struct Point { int x, y; } origin;のような書き方が可能である事実を見ると分かりやすくなります。閉じ波括弧の直後には、実はその場で定義した型の変数名を続けて書くことができ、これはint x;と同じ「型名(または型定義)に続けて変数名を書く」という宣言の文法にちょうど当てはまります。変数名を書かない場合でも、この宣言としての文法上の枠組み自体は残るため、宣言を終わらせるセミコロンが必要になるのです。