2011-10-14 31 views
0

我在Visual Studio 2008中有一个C++项目。在C++ Visual Studio 2008中未声明的标识符

在项目中,我有几个表单和几个非表单类。一种非形式的具体称为Import_LP.h的类,它是一个包含多个方法的类,所有这些方法都写在头文件中,而资源文件中却没有任何内容。

我有#包括Import_LP没有问题,在任何形式的类和创建对象和引用它的任何方法,但任何其他类我尝试它#包含进去,它给了我一个

syntax error : undeclared identifier 'Import_LP' 
它所引用的行上的

发生,即Import_LP^importLP;

我来自java/c#背景有什么我失踪的链接在这里?

回答

1

如果你有包括守卫,它是这样的:预处理器包括Import_LP.h,它说“只包括我一次”,然后包括Window.h,它试图包含Import_LP.h,但不是因为包括后卫。因此Window.h开始解析窗口类,但因为Import_LP失败。h类头还没有完全加载。

的解决方案是预先声明的类:

window.h中:

#ifndef WINDOW_H //works best if this is first 
#define WINDOW_H 
#pramga once 

class Import_LP; 
class Window { 
    Import_LP* member; //member has to be a pointer 
    void func(); 
}; 
#include "Import_LP.h" 
inline void Window::func() { 
} 
#endif WINDOW_H 

Import_LP.h:

#ifndef IMPORT_LP_H //works best if this is first 
#define IMPORT_LP_H 
#pramga once 

class Window; 
class Import_LP { 
    void func(Window& parent); //parameter has to be a pointer or reference 
}; 
#include "Window.h" 
inline void Import_LP::func(Window* parent) { 
} 
#endif IMPORT_LP_H 

这将只允许通过指针引用其他或直到实际包含为止,但这应该是可行的。从技术上讲,你只需要对其中一个或另一个标题做这件事。

0

听起来像Import_LP类型是未定义的,您的挑战是找出原因。首先要做的是读取import_LP.h的内容,并找出如何声明Import_LP。一种可能的方法是打开其中一个好文件,右键单击Import_LP并选择“转到声明”。这应该将焦点转移到适用于该特定情况的Import_LP声明中。

它可能是声明被#ifdef包围,它以某种方式阻止它被编译到其他文件中。或者它可能是别的,我们没有足够的细节来处理。

更新:

因此很明显,你不能有两个文件包括对方? 。 。 。 我将不胜感激,如果有人可以向我解释为什么你 不能做到这一点。

当你这样做时,你最终可能会多次定义类型和变量。

有像#include guard#pragma once这样的技术可以用来缓解这些问题。

+0

感谢您的回复, 我确实有#include Import_LP ^,当我右键单击 - >在对象声明上找到声明时,Import_LP ^,它正确地指向了正确的类。 我有申报列入完全相同的方式与其他好文件相同。另外,这些文件中没有#ifdef。 这是在Import_LP.h 开头的声明的#pragma一次 的#ifndef IMPORT_LP_H 的#define IMPORT_LP_H – ped

+0

你没有一个#include“Import_LP.h”? – crashmstr

1

我能够通过随机机会解决问题。

显然你不能有两个文件包含对方?

我在Import_LP.h

#include Window.h 

#include Import_LP.h 
在window.h中

如果有人能向我解释为什么你不能这样做,我将不胜感激。

+0

我在答案中提出了问题和解决方法的完整描述 –