ヘッダーファイルをインクルードする順番に決まりがあるのでしょうか

[戻る]
はまち 2002/03/03(日) 04:37:24
 今、スプリッタ-ウィンドウで5つにわけ、それぞれ別々のViewを表示させるようなプログラ
ムを作っています。
 そのうちの2つのウィンドウでCHistViewクラスとCGraphViewクラスという自作したクラスを
使っているのですが、なぜかビルドすると片方のクラスが認識されずにエラーが出てしまいま
す。
 CMainFrameクラスのOnCreateClient()関数の中で

m_wndSplitter3.CreateView(2,0,RUNTIME_CLASS(CHistView),CSize(100,360),pContext);

というように使っているのですが、

error C2653: 'CHistView' : 識別子がクラス名でも名前空間名でもありません。

というようにエラーが出てしまいます。MainFrm.cppの初めで

#include "GraphView1.h"
#include "HistView1.h"

とどちらもインクルードしているのですが、なぜかうまくいきません。ところが不思議なことに

#include "HistView1.h"
#include "GraphView1.h"

とインクルードする順番を変えると今度は、

error C2653: 'CGraphView' : 識別子がクラス名でも名前空間名でもありません。

とCGraphViewクラスの方が認識されなくなってしまいます。以前にも、クラスが認識されない
ときにインクルードする順番を前の方に持ってくるとうまくいく場合があったのですが、このよ
うになにかインクルードする順番にルールとかあるのでしょうか。

みなさん、お忙しいとは思いますが、なにか気づいた点、同じような症状などに合われた点など
があれば何でもいいです、教えてください。よろしくお願いします。

環境
 Win 98SE
  VC++6.0
 です。

2002/03/03(日) 08:29:24
特にこの場合では順番は関係ないと思います。
ヘッダーファイルに問題があるのではないでしょうか?

TAD [E-Mail] 2002/03/03(日) 09:37:22
ヘッダーファイルの最初の #if !defined と、次の行の #define の中身が、二つのファイル
で同じになっていませんか?
これは、多重インクルードを防ぐためのものなので、一意な記号定数でなければなりません。
確認してみてください。

はまち 2002/03/05(火) 17:21:55
[[解決]]
お返事が送れてすみませんでした。重さん、TADさん、お返事ありがとうございました。重さん
とTADさんの言っていた通りでし
た。HistView1.h、GraphView1.hどちらも、別の自作クラスのCParameterListをポインタとし
てメンバ変数で使いたかったので、

#if !defined(_CPARAMETERLIST_)
#define _CPARAMETERLIST_

class CParameterList;

としていたのですが、ここをそれぞれ名前を変えて、

//HistView1.h
#if !defined(_CPARAMETERLIST1_)
#define _CPARAMETERLIST1_

//GraphView1.h
#if !defined(_CPARAMETERLIST2_)
#define _CPARAMETERLIST2_

としたらうまくいきました。やっぱり同じ物をインクルードしようとしていたんですね。

いつも月並みなお返事になってしまうのですが、今回も助かりました。ありがとうございまし
た。

古いスレッドには追加発言できません。