【问题标题】:undeclared identifier in C++ Visual Studio 2008C++ Visual Studio 2008 中未声明的标识符
【发布时间】:2011-10-14 22:04:52
【问题描述】:

我在 Visual Studio 2008 中有一个 C++ 项目。

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

我对任何表单类中的#include Import_LP 以及创建对象和引用它的任何方法都没有问题,但是我尝试将它#include 到的任何其他类,它给了我一个

syntax error : undeclared identifier 'Import_LP'

在它被引用的行上出现,即 Import_LP^ importLP;

我来自 java/c# 背景,这里的链接有什么遗漏吗?

【问题讨论】:

    标签: c++ visual-studio-2008 visual-c++


    【解决方案1】:

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

    解决方案是预先声明类:

    窗口.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 
    

    这将只允许您通过指针或引用来引用另一个,直到实际包含,但这应该是可行的。从技术上讲,您只需对一个或其他标题执行此操作。

    【讨论】:

      【解决方案2】:

      我能够偶然解决这个问题。

      那么显然你不能让两个文件相互包含?

      我在做

      #include Window.h
      

      在 Import_LP.h 中

      #include Import_LP.h
      

      在 Window.h 中。

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

      【讨论】:

      • 我在答案中对问题和解决方法进行了完整描述
      【解决方案3】:

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

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

      更新:

      那么显然你不能让两个文件相互包含? . . . 如果有人能向我解释你为什么 不能这样做。

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

      #include guard#pragma once 等技术可用于缓解此类问题。

      【讨论】:

      • 感谢您的回复,我确实有#include Import_LP^,当我右键单击->在对象声明Import_LP^上找到声明时,它正确地指向了正确的类。我已经声明并包含了与其他好文件完全相同的方式。此外,这些文件中没有使用#ifdef。这是 Import_LP.h 开头的声明 #pragma once #ifndef IMPORT_LP_H #define IMPORT_LP_H
      • 您没有#include "Import_LP.h" 吗?
      猜你喜欢
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多