2013-08-02 104 views
-2

如果創建可讀性結構內的枚舉,這裏所說的 How to avoid name conflicts for two enum values with the same name in C++?C++使用結構枚舉作爲參數不會編譯

我打算增加更多的枚舉,在這裏和在其他情況下,我只是想知道爲什麼結構不編譯。來自C#和Java我希望有一個更簡單的語法 -

並且有結構作爲類的構造函數的參數,我不能從控制檯應用程序的main.cpp調用它。 它給我的錯誤**呼叫toBarEnc :: BarEnc(BarEnc ::方案:: eScheme)」沒有匹配的功能**的main.cpp

這裏是類

class BarEnc { 
public: 
    struct Scheme 
    { 
     enum eScheme 
     { ADJ1M2, ADJ3M6 
     }; 
    }; 

    BarEnc(); 
    BarEnc(BarEnc::Scheme scheme); 
} 

。 CPP 我把它叫做

BarEnc barEnc = BarEnc(BarEnc::Scheme::ADJ3M6); 

但是,如果我在構造函數參數更改爲int的代碼編譯

BarEnc(int scheme); 

如果我將其更改爲枚舉代碼編譯

BarEnc(BarEnc::Scheme::eScheme scheme); 

但是,當它是一個結構,它不編譯。我對C++比較陌生,使用GCC 4.6在Linux上編譯,使用99標準。

是否有我無法使用結構作爲參數的原因?

+0

你想要你的構造函數做什麼? – juanchopanza

+0

它需要保持類中的枚舉值,我使用的結構,因爲它被推薦,因爲它提高了可讀性,我希望一致性 – pt123

+0

但是你的類沒有枚舉實例。沒有什麼可以設置的。 – juanchopanza

回答

2

簡單的問題:你的枚舉值應該如何轉換爲struct?

簡單的回答:沒有辦法,因爲沒有合適的構造函數。

你的結構有沒有成員,它只有類型(enum),因此,我不知道,你想要做什麼。

+0

那麼爲什麼它們在我發佈的那個線程的結構體中包含枚舉值,如果你必須編寫像BarEnc :: Scheme :: eScheme方案這樣的長參數類型) – pt123

+0

@ pt123當然是爲了安全。 – ForEveR

+0

@ p123因爲鏈接的問題詢問有幾個枚舉包含相同的標識符(在這種情況下爲「無」),並將枚舉放入結構中爲名稱添加了前綴。既然你沒有這個問題,那麼這個解決方案對你來說是沒用的。 – molbdnilo

0

可以使用結構作爲參數。 但是你的struct BarEnc::Scheme其實沒有成員。

和常量值BarEnc::Scheme::ADJ3M6的類型是BarEnc::Scheme::eScheme,它不能自動轉換爲結構。

+0

那麼爲什麼他們將enums包含在我發佈的那個線程的結構體中,如果你必須編寫像BarEnc :: Scheme :: eScheme方案這樣的長參數類型) – pt123

1

在聲明構造函數

BarEnc(BarEnc::Scheme scheme); 

你告訴了BarEnc構造函數採用結構作爲參數編譯器,所以它是一個枚舉,而不是你無法通過枚舉值結構體。創建你通過BarEnc對象時

class BarEnc { 
public: 
    enum eScheme { 
     ADJ1M2, 
     ADJ3M6 
    }; 

    BarEnc(eShceme scheme); 
}; 

然後:


在這種情況下,實際上是獨立的結構,沒有用剛剛定義枚舉,你可以直接在周圍的類中聲明它枚舉值:

BarEnc barenc(BarEnc::eScheme::ADJ1M2); 
+0

我認爲點圍繞枚舉使用結構是爲了提高可讀性,因爲您不會將它與另一組枚舉混淆 – pt123

+0

@ pt123那麼,如果您害怕這一點,只需通過編寫'BarEnc :: eScheme :: ADJ1M2'完全限定枚舉即可。相反,仍然不需要把它放在一個空的結構中。 –