ぷるぷるの雑記

低レイヤーがんばるぞいなブログ. 記事のご利用は自己責任で.

';'が'*'の前にありませんの解決方法

Visual StudioC++のプロジェクトをビルド中、「構文エラー: ';'が'*'の前にありません。」というエラーが出たときの対処法のメモ.

まずは文法的な間違いがないかを確認. どこかしらで括弧やセミコロンが抜けていればそこを修正すれば解決するかも.

しかし、文法的な誤りがどうしても見つからない場合、もしかしたら 循環参照 が悪さをしているかも. 2つのクラスのヘッダでお互いのクラスのヘッダが必要な状況を循環参照というが、この場合お互いのクラスの型のメンバを持つことが出来ない. ただし、クラスの型へのポインタであればメンバに持つことが出来る.

// 典型的な循環参照

// MyClassA.h
#include "MyClassB.h"
class MyClassA{
private:
          MyClassB* myClassB;
}

// MyClassB.h
#include "MyClassA.h"
class MyClassB{
private:
          MyClassA* myClassA;
}



ここからは半分勘なのだが、どうやら循環参照が生じているとクラス名をうまくクラスだと解釈されないことがある模様. なのでクラス名の前に明示的にclass キーワードをつけるとビルドが通った.

// メンバ変数の宣言時にもclassキーワードをつける

// MyClassA.h
#include "MyClassB.h"
class MyClassA{
private:
          class MyClassB* myClassB;
}

// MyClassB.h
#include "MyClassA.h"
class MyClassB{
private:
          class MyClassA* myClassA;
}



C++は(structと同様)クラス型の変数の宣言にclassキーワードをつけてもつけなくてもよいことになっているが、どうしてもわからないエラーに出くわしたときにとりあえずクラス名の前にclassキーワードをつけておくと解決することがあるので、覚えておいて損はないはず.

参考

marupeke296.com

myoga.web.fc2.com