[英]C++ Enum inside a class - order of declaration matters?
我正在使用visual studio 2010,但不太明白,這個類怎么錯了(語法錯誤:標識符'EnumType')並且無法編譯:
class BrokenClassWithEnum
{
private:
void useEnum (EnumType enumType); //syntax error : identifier 'EnumType '
public:
enum EnumType
{
VAL1,
VAL2,
VAL3
};
}
我不認為定義(非聲明)的順序很重要,但前向聲明將解決此錯誤 - 至少在MSVC ++ 6中。在MSVC ++ 6之外,您應該指定一個存儲類型來轉發聲明一個枚舉(指定的要求)前向枚舉中的存儲類型是在C ++ 0x標准中)
注意:VC ++ 6將允許省略存儲類型,但如果您正在聲明枚舉,則應聲明存儲類型(見下文):
class BrokenClassWithEnum {
public:
enum EnumType;
private:
void useEnum (EnumType enumType);
public:
enum EnumType {
VAL1,
VAL2,
VAL3
};
};
class BrokenClassWithEnum {
public:
enum EnumType : int;
private:
void useEnum (EnumType enumType);
public:
enum EnumType : int {
VAL1,
VAL2,
VAL3
};
};
注意:在某些但不是所有C ++版本中都可以轉發枚舉聲明:
在類定義本身中,項必須按順序出現(依賴項出現在依賴於它們的項之前),就像它們在任何其他范圍一樣。 在類方法體內 (即使內聯),可以使用類的整個定義。
在C ++中,任何引用的非內置名稱必須先於某處聲明。
看起來這個規則對類定義有例外,因為以下工作正常:
struct S
{
void foo() { cout << x_ << endl; }
int x_;
S(): x_( 42 ) {}
};
但是,關於使用前聲明的規則適用於轉換后的代碼
struct S
{
inline void foo();
int x_;
inline S();
};
void S::foo() { cout << x_ << endl; }
S::S() : x_( 42 ) {}
這是編譯器“正確”看到的。 在這里沒有使用任何尚未宣布的東西。
適合您的問題的C ++ 03解決方案是在首次使用之前定義枚舉類型。 使用C ++ 11,您可以替代地向前聲明它,但是必須指定基礎類型,
C ++11§7.2/ 3 :
“ opaque-enum-declaration是對當前作用域中枚舉的重新聲明或新枚舉的聲明。 [ 注意: opaque-enum-declaration聲明的枚舉具有固定的底層類型,並且是完整類型。 可在隨后的重聲明中提供有enum-符枚舉的列表。 -end note ]范圍內的枚舉不得在以后重新聲明為無范圍或具有不同的基礎類型。 未作明目的的枚舉不得在以后重新聲明為范圍,每次重新聲明應包括一個枚舉基礎,指明與原始聲明中相同的基礎類型。“
我相信可以在類中的聲明之前訪問成員變量,因為類驗證或編譯是在兩遍中完成的。
"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.