2013-10-29 83 views
0

枚舉聲明,PSLGVertex :: PSLGVertex()構造抱怨的最後一個參數,它的「PSLGVertexType」不是一個類或命名空間」通過枚舉的構造函數的參數在全球範圍內遵循

我是什麼在這裏做錯了嗎?

enum PSLGVertexType { 
REFLEX_VERTEX, 
CONVEX_VERTEX, 
MOVING_STEINER_VERTEX, 
MULTI_STEINER_VERTEX, 
RESTING_STEINER_VERTEX, 
OTHER_VERTEX 
}; 

構造

PSLGVertex::PSLGVertex() : mark(false), oriPosition(0, 0), speed(0, 0), 
startTime(0.0),firstin(NULL), firstout(NULL),type(PSLGVertexType::OTHER_VERTEX) 

回答

1

您使用PSLGVertexType::,它告訴編譯器PSLGVertexType是一類/結構或命名空間,但它既不。

使用普通的OTHER_VERTEX

+0

是的我也試過這個,但編譯器抱怨「類'PSLGVertex'沒有任何字段名爲'OTHER_VERTEX'」我真的不明白爲什麼編譯器看起來在類定義中找到實際上它定義的枚舉頭文件中的全局範圍而不是類體中的全局範圍。這不是很奇怪嗎? –

+0

這並不奇怪,因爲類名稱是當前最內層的範圍,所以這是編譯器首先查找的地方,然後逐漸「剝離」封閉範圍。無論如何,你說枚舉是在全局命名空間,所以如果你說':: OTHER_VERTEX'會發生什麼? –

+0

這又是一個錯誤,編譯器通常會在這些事件中導致一些無法理解的錯誤,它更好地信任直覺而不是編譯器輸出。順便說一句,我注意到,這種類型(PSLGVertexType :: OTHER_VERTEX)是「類型」變量,這是PSLGVErtexType類公開部分中聲明,我認爲它是關鍵字或一些typcasting,但實際上它不是。 AFAIU在構造函數中不調用任何函數,但用該表達式初始化類中的某些屬性。所以問題變成如何分配給局部變量一個枚舉?嘗試過的類型= PSLGVertexType :: OTHER_VERTEX –

0

在C++中 - 03,enum成員被放置在封閉範圍內。所以不要說

PSLGVertexType::OTHER_VERTEX 

而只是

OTHER_VERTEX 

在C++ 11,你的代碼將被罰款,因爲體放置在兩個封閉範圍(用於向後兼容)和在內部枚舉範圍內。

C++ 11也有新的範圍枚舉,您可以閱讀關於on Wikipedia

+0

請檢查我的以前回答它再次引發我在QtCReator中使用MinGW和GCC 4.4的錯誤。 –