ページ 11

ヘッダをインクルードするとエラーが出てしまう

Posted: 2010年5月16日(日) 21:05
by テトリ
 こんにちわ。どうしてもわからないエラーがあるのでよろしくお願いします。

環境
Windows XP Professional
Visual Studio 2005

・やろうとしていること
クラスAのメンバのクラスBのポインタを、
グローバル変数として用意したい。

・困ってること
クラスBが宣言されているヘッダファイルを
グローバル変数用のヘッダファイルでインクルードしようとすると、
エラーが発生する。

//----------------------------------------------------------------------------
・詳細です

ファイルは以下の様な構成でヘッダファイル3つと、ソースファイル3つです。

global.h //グローバル変数のextern宣言
global.cpp //グローバル変数の実体
main.h //MainControlクラスの宣言
main.cpp //MainControlクラスの内容
sub.h //SubControlクラスの宣言
sub.cpp //SubControlクラスの内容

SubControlクラスはMainControlクラスのメンバとして使用しています。

class MainControl{
private:
SubControlsubcnt;
}

また、global.h を main.h と sub.h でインクルードしています。
※global.h にはSTLのvectorを利用するために #include <vector> の記述があります。

ここで、 global.h と global.cpp に SubControlクラスのポインタを用意するために、
global.h の中で sub.h をインクルードすると、main.cpp のコンパイル中に下記のように
エラーがでてしまいます。

//-----------------------------------------------------------------------------
sub.h(同じ行) : error C2143: 構文エラー : ';' が '<' の前にありません。
sub.h(同じ行) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
sub.h(同じ行) : error C2238: ';' の前に無効なトークンがあります。
//-----------------------------------------------------------------------------
'<'は vector<構造体> 変数名 ・・・の部分の<です。
なぜかvectorが型として認識されていないようです。

エラーが発生する状況としては sub.h に global.h をインクルードする記述があり、
さらに global.h に sub.h をインクルードする記述があると、
このようなエラーが発生するようなのですが、
なぜエラーになってしまうのでしょうか?

関係あるかどうか分かりませんが、ヘッダファイルは、全て複数回読込を防ぐために、
#ifndef xxx
#define xxx
#endif
を記述しています。

また、各ヘッダファイルがインクルードしているものは次の通りです。
global.h
#include "DxLib.h"
#include <vector>
#include "frame.h"

main.h
#include "global.h"
#include "sub.h"

sub.h
#include "global.h"

Re:ヘッダをインクルードするとエラーが出てしまう

Posted: 2010年5月16日(日) 21:37
by たかぎ
エラーが再現するコードを貼った方がよいのでは?

Re:ヘッダをインクルードするとエラーが出てしまう

Posted: 2010年5月16日(日) 22:36
by テトリ
ソースファイルとヘッダファイルです。
global.hの9行目が問題の箇所です。★マークつけておきました。
よろしくお願いします。

Re:ヘッダをインクルードするとエラーが出てしまう

Posted: 2010年5月16日(日) 22:42
by たかぎ
ざっと見ただけですが、global.hとsub.hが循環参照になっていますね。

Re:ヘッダをインクルードするとエラーが出てしまう

Posted: 2010年5月16日(日) 23:35
by テトリ
循環参照というものを始めて聞いたのでさっそくgoogleで
調べてみたのですが、厄介なもののようですね;
ずっとヘッダファイルは#ifndef~を書いておけば大丈夫という認識でした。

ヘッダ間で循環が起きないように工夫していきたいと思います。
どうもありがとうございました。