不能在另一个声明中使用声明的结构

时间:2014-10-23 10:00:32

标签: c++ visual-c++

我有包含类声明的标头。

DialogExInput.h

#include "Stdafx.h"

#pragma once
#include "utils.h"

// CDialogExInput dialog

class CDialogExInput : public CDialogEx
{
    DECLARE_DYNAMIC(CDialogExInput)

public:
    CString timeRemainedSecStr;
    CString Caption;
    int TimeoutSec; 
    int MinDataSize;
    int MaxDataSize;
    CString text;
    int timeRemainedSec;
    void AssignParams (DialogOptions* dOp);
    CDialogExInput(UINT nIDTemplate, CWnd *pParent = NULL);

    afx_msg void OnTimer(UINT uTime);
    virtual ~CDialogExInput();
    void SetOnTop();


protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    virtual BOOL OnInitDialog();
    DECLARE_MESSAGE_MAP()

};

编译器无法找到DialogOptionsutils.h中声明了DialogExInput.hutils.h包括Error 1 error C2061: syntax error : identifier 'DialogOptions'

#ifndef UTILS_H
#define UTILS_H

#include "InputDialog.h"
#include  <string> 

using namespace std;


#define CURRENCY_EUR 978
extern HWND AuthMsgHWND;


struct DialogOptions {
    CString Caption ;
    CString DefaultText;
    int MaxTimeoutExpected;
    int MaxChars;
    int MinChars;
    int ModalResult;
    int inputTimeRemained;
} ;


void ErrorExit();
const wchar_t *GetWC(const char *c);
bool GetProductAndVersion(CStringA & strProductName, CStringA & strProductVersion);
void doInputDialog(DialogOptions *pDo, string & answer);
void doYesNoDialog(DialogOptions *pDo, string & answer );
wstring termToWchar (const char* value);
string getTime(string format  = "%d-%m-%Y %I:%M:%S" );


#endif UTILS_H

utils.h

DialogExInput.h

那么问题出在哪里?为什么DialogOptions看不到{{1}}

1 个答案:

答案 0 :(得分:0)

存在循环

DialogExInput.h

#pragma once
#include "utils.h"

InputDialog.h

#include "DialogExInput.h"

utils.h

#include "InputDialog.h"

因此,如果您在其他任何地方(出错之前)包含InputDialog.h,那么将按以下顺序读取文件

Inputdialog.h DialogExInput.h utils.h

因此,

和DialogExInput无法看到utils.h。

的内容

如果在DialogExInput .h的开头添加struct DialogOptions的前向声明

#include "Stdafx.h"

#pragma once
#include "utils.h"

struct DialogOptions; // forward declare as you only use a pointer/reference to it.

// CDialogExInput dialog

class CDialogExInput : public CDialogEx

制作单独的包含文件也是一种选择。

此外,您应该打破循环包含,检查您是否确实需要这些包含。如果你不这样做,它会回来再咬你。