2011-10-14 55 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

我在答案中提出了問題和解決方法的完整描述 –