语法错误:缺少 ';'在标识符“iDlg”之前

Posted

技术标签:

【中文标题】语法错误:缺少 \';\'在标识符“iDlg”之前【英文标题】:syntax error : missing ';' before identifier 'iDlg'语法错误:缺少 ';'在标识符“iDlg”之前 【发布时间】:2012-07-16 10:16:26 【问题描述】:

我试图让一个对话框 [import] 从另一个对话框 [baseline] 启动。 我包含了所需的“.h”文件,但是我根本无法创建导入类的实例。我得到的错误是这样的:

Error   1   error C2146: syntax error : missing ';' before identifier 'iDlg'    h:\shaunak\projects\sar_ccd\sar_ccd\baseline.h  202 1   Sar_CCD

导致此 [baseline.h] 的代码行:

#include "Markup.h" 
#include<stdio.h>
#include<math.h>
#include "baseline_func.h"
#include "resource.h"
#include "Functions.h"
#include <stdlib.h>
#include "Sar_CCDDoc.h"
#include "Sar_CCDView.h"
#include <vector>
#include "MemAlloc.h"
#include "ReadFiles.h"
#include<vector>
#include<map>
#include "afxwin.h"
#include "import.h"
#include "Geocode.h"




**<SNIP: Taking out the irrelevant lines>**

     afx_msg void OnDestroy();
     virtual void PostNcDestroy();
     afx_msg void OnBnClickedNxtBase();
     CButton nextBaseline;


    import iDlg;               //doesnt work!
    CGeocoding cx;             //works!!!
;

但是,如果我像这样使用相同的 sysntax 创建另一个类 [Geocoding] 的实例,它可以正常工作:

#include "Geocoding.h"
CGeocoding cx;

请帮我找出原因。

完整代码:

baseline.h:http://freetexthost.com/on06wref6c import.h:http://freetexthost.com/x4e4dkwrve

【问题讨论】:

import iDlg; 实际上是什么? import 是你的一个类吗? import 是您创建的吗?或者它是否记录在某处? (除非您告诉我们,否则我们不知道这段代码应该做什么。) 顺便说一句,` ` 在所有这些#includes 和#defines 之后看起来很有趣:P 三重检查您是否没有其他名为import.h(或Import.h,因为您的平台不区分大小写)的文件可能会被包含,而不是您期望的文件。另一种可能性是您稍后包含的某些标题有一个 #define import __declspec(dllimport) 这会破坏事情。 @eternalDreamer,这很奇怪,根据您提供的代码,它应该工作 【参考方案1】:

在 Visual Studio 中,有一个关键字 import 或 #import 用于导入 COM DLL,也用于其他事情。我猜你在那里遇到了名称冲突。

为了解决这个问题,请将您的类导入放在 namespace

import.h

namespace myimport

  class import : public CDialog  
  ...
  ;
;

import.cpp

namespace myimport

  ...
;

那么当你使用它时

myimport::import iDlg;

这应该可以解决问题,尽管将其重命名为“import”以外的其他名称会是更好的方法。

【讨论】:

有什么简单的方法重构类吗? 我花了一些时间下载工具来重命名它,但无济于事。 :( 它仍然不起作用。并且命名空间会变得混乱,因为整个项目都在使用这个类。我稍后会关注这个。【参考方案2】:

import 不是 C++ 中的关键字或类型。因此,您会收到语法错误,因为编译器无法识别 import

要创建另一个类的实例,您必须正确声明它,例如:

class baseline : public CDialog

    // ...

    CDialog *iDlg;  // Pointer to imported dialog
;

记得初始化指向实际对话框的指针。

【讨论】:

这个怎么样:struct import...; import iDlg;? 我不打算使用“import”作为关键字。 “import”是继承自CDialog的类的名称,就像“CGeocoding”一样。 如果我不够清楚,我真的很抱歉 但无论如何命名一个类 import 是个坏主意 @andrew - 在我之前从事这个项目的女孩。而且我无论如何都找不到“重构”它(就像在 C# 中一样)

以上是关于语法错误:缺少 ';'在标识符“iDlg”之前的主要内容,如果未能解决你的问题,请参考以下文章

错误:C2146:语法错误:缺少“;”在标识符“m_Employer”之前,

错误 C2146:语法错误:缺少“;”在标识符“ContextRecord”之前

错误 C2146:语法错误:缺少“;”在标识符 'm_ball' C++、MFC 之前

vs2008编译错误:error C2146: 语法错误 : 缺少“;”(在标识符“name”的前面)

显式链接错误 - 语法错误:缺少 ';'由 bazel 编译时在 '*' 之前

javascript 中的语法错误:缺少;声明之前