• ベストアンサー

[Visual C++ 6.0] コンパイル(ビルド)エラー

※参考までに『3週間完全マスターVisual C++ 6.0 』という本の「5日目」の部分を進めていて詰まってしまいました。 ビルドすると、下記のDialogsDlg.h中の「CMsgDlg m_dMsgDlg;」の辺りに対して error C2146: 構文エラー : ';' が、識別子 'm_dMsgDlg' の前に必要です。 error C2501: 'CMsgDlg' : 識別名を宣言するのに、型が指定されていません。 error C2501: 'm_dMsgDlg' : 識別名を宣言するのに、型が指定されていません。 というエラーが出てしまいます。CMsgDlgというクラスはちゃんと作っていますし、構文的にも間違ってはいないと思うのですが、何がいけないのでしょうか? 説明が足りなければ補足します(見づらくてスミマセン)。 // DialogsDlg.h : #if !defined(AFX_DIALOGSDLG_H__4772C7E5_F2C9_4E57_99B8_EF1D44426473__INCLUDED_) #define AFX_DIALOGSDLG_H__4772C7E5_F2C9_4E57_99B8_EF1D44426473__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif class CDialogsDlg : public CDialog { public: CDialogsDlg(CWnd* pParent = NULL); enum { IDD = IDD_DIALOGS_DIALOG }; CButton m_cWhichOption; CString m_sResults; protected: virtual void DoDataExchange(CDataExchange* pDX); protected: HICON m_hIcon; //{{AFX_MSG(CDialogsDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnExit(); afx_msg void OnYesnocancel(); afx_msg void OnAbortretryignore(); afx_msg void OnFileopen(); afx_msg void OnBcustomdialog(); afx_msg void OnBwhichoption(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: CMsgDlg m_dMsgDlg; }; #endif

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

プロジェクトに含まれるすべてのソース中で、DialogsDlg.hがインクルードされているソースに関してMsgDlg.hのインクルードを追加しましたか? m_dMsgDlgを呼び出しているところだけではありませんよ。

kaneta
質問者

お礼

アドバイス有難う御座います。 ズバリ、おっしゃる通りでした。 "DialogsDlg.h"をインクルードしている .cpp ファイルが2つあったことに気付きませんでした。もうひとつの方にインクルード文を追加したところ、無事にコンパイルできました。(言い訳にしかなりませんが、参考にしていた本にはそういった旨の記述がなかったので、気付きませんでした。) どうも有難う御座いました。助かりました。

その他の回答 (1)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

ヘッダファイル(DialogsDlg.h)では無く、このヘッダファイルをインクルードしているソースファイル(.cpp)を見てください。 たぶん… DialogsDlg.h を#includeする前にインクルードするべきヘッダファイルの#includeが抜けています。

kaneta
質問者

補足

素早い回答、有難うござます。 確かに"DialogsDlg.h"内で使われているCMsgDlgというクラスの定義は"MsgDlg.h"という別なヘッダーファイルでされているのですが、そのインクルードの順番の妙についても、参考にしている本にはちゃんと記述してありまして、そこでも言われているようにソースファイルでのインクルードの順番はちゃんと #include "MsgDlg.h" #include "DialogsDlg.h" にしてあります。 ちなみに、その後 CMsgDlg m_dMsgDlg; の宣言文をソースファイル内に持ってきてしまったらちゃんとコンパイルが通ったので、クラスの定義には問題はなく、やはり参照する順番や制限に問題があるのかと思うのですが、少なくとも上記にも書いた通りソースファイルでのインクルードの順番は間違っていないと思うのですが…。 ヘッダーファイル同士での参照は何か特別な記述がいるのでしょうか?

関連するQ&A