2009-08-17 65 views
2

我遇到了一些奇怪的東西,我不太明白。解決標識符「xxx」是未定義的

我得到這樣的錯誤:

framework/CP_STLArrayDefines.h(37): error: identifier "CP_String" is undefined 
    typedef std::vector<CP_String, std::allocator<CP_String> >      CP_Strings_Array; 
         ^
framework/CP_STLArrayDefines.h(37): error: identifier "CP_String" is undefined 
    typedef std::vector<CP_String, std::allocator<CP_String> > 

但是,如果我去CP_STLArrayDefines的樣子,我清楚這樣做的:

#include "CP_String.h" 

,如果我去看看CP_String.h和.cpp他們似乎精細。

他們都在同一個目錄等。

我應該尋找什麼東西?

這裏是CP_STLArrayDefine.h:

#ifndef CP_STLArrayDefines_H 
#define CP_STLArrayDefines_H 

#ifndef TARGET_OS_LINUX 
# pragma once 
#endif 

// CPLAT_Framework 
#include "CP_Point.h" 
#include "CP_String.h" 
#include "CP_Types.h" 

// Standard Library 
#include <vector> 

CPLAT_Begin_Namespace_CPLAT 

    // typedefs 
#if ! TARGET_OS_LINUX 
    typedef std::vector`<CP_String, std::allocator<`CP_String>` >`      CP_Strings_Array; 
    typedef std::vector`<CP_String, std::allocator<`CP_String>` >`::iterator   CP_Strings_Iterator; 
    typedef std::vector`<CP_String, std::allocator<`CP_String>` >`::reverse_iterator CP_Strings_ReverseIterator; 
+1

那麼,該文件被稱爲CP_String.h,但你確定你感興趣的類是? – 2009-08-17 17:04:29

+1

聽起來像一個變種http://stackoverflow.com/questions/1282212/global-structs-not-being-seen – 2009-08-17 17:04:55

+0

此外,你確定頭文件之間沒有循環依賴? – Naveen 2009-08-17 17:06:08

回答

4

如果您確定它不是一個循環包含,那麼請記住,您始終可以回到那種經常被忽視的使用適當的編譯器開關的技術來轉儲出預處理的源代碼,即在編譯階段之前停止它。通過輸出搜索,你會發現爲什麼編譯器抱怨,因爲你現在正在看編譯器看到什麼。

該選項是/ E在MSVC和-E與gcc。

2

是否可能還CP_String.h包括CP_STLArrayDefines.h,所以這兩個文件嘗試包括對方?如果在頭文件中包含警衛,這可能會導致您所描述的錯誤。

+0

否CP_String.h不包含CP_STLArrayDefines.h。每頭quard是正確的:
的#ifndef _H_CP_STLArrayDefines 的#define _H_CP_STLArrayDefines和的#ifndef再次_H_CP_String 的#define _H_CP_String – user147502 2009-08-17 17:12:50

+2

,我想指出的是,這些頭名後衛是非法的。以下劃線和大寫字母開頭的名稱保留給C++實現。 – 2009-08-17 17:25:45

+0

@neil - 所以Header衛兵應該是CP_STRING_H?非法或不是,這不會是我的錯誤的來源,但是,對嗎? – user147502 2009-08-17 17:32:36

1

CP_String.h是否有適當的防護?我的意思是,標題多包容的警衛,當然。

難道是在CP_String.h之前包含的一個標頭具有與守衛中使用的相同的符號(發生時,當您複製粘貼包括從一個標頭到另一個標頭時)。

+0

警衛是正確的:#ifndef _H_CP_String #define _H_CP_String和#ifndef _H_CP_STLArrayDefines #define _H_CP_STLArrayDefines – user147502 2009-08-17 17:14:11

0

我沒有足夠的信息給你答案,但我會大膽猜測你所看到的錯誤的可能原因。 CP_String是在命名空間內聲明的嗎?如果是這樣,它是什麼?我看到宏調用:CPLAT_Begin_Namespace_CPLAT,我認爲它的作用類似於using namespace CPLAT;,也許有些標準設置。也許,由於您在評論中提到的重組,CP_String不再位於CPLAT命名空間中,因此編譯器無法找到它。