簡體   English   中英

"類中的 C++ 枚舉 - 聲明的順序很重要?"

[英]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將允許省略存儲類型,但如果您正在聲明枚舉,則應聲明存儲類型(見下文):

這將解決VC ++ 6中的錯誤。 但是,VC ++ 6似乎不支持C ++ 0x標准所要求的類內枚舉的存儲類型:

class BrokenClassWithEnum {
public:
    enum EnumType;

private:
    void useEnum (EnumType enumType); 
public:
    enum EnumType {
        VAL1,
        VAL2,
        VAL3
    };
};


通常在符合C ++ 0x的編譯器中使用IE,您可以使用以下內容:

class BrokenClassWithEnum {
public:
    enum EnumType : int;

private:
    void useEnum (EnumType enumType);
public:
    enum EnumType : int {
        VAL1,
        VAL2,
        VAL3
    };
};

注意:在某些但不是所有C ++版本中都可以轉發枚舉聲明:

轉發在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM