2015-05-20 19 views
8

İlk sorumu yazarken, bu mümkün olsa bile, temiz çözümün C++ ile mümkün olmadığını açıkça belirten static constexpr member of same type as class being defined sorusu üzerine tökezledim 11.Sınıf olarak tanımlanmış aynı türdeki statik constexpr üyeleri (ek ayrıntılar)

Ama sonra gönderen oldukça yakın olan bu kod ile geldi ve ben başarmak istiyorum:

Yani
class MyEnum 
{ 
public: 
    constexpr MyEnum() : m_null(true), m_value(0) { } 
    constexpr MyEnum(const unsigned int v) : m_null(false), m_value(v) { } 

    constexpr operator unsigned int() const { return m_value; } 

    static constexpr const MyEnum one() { return MyEnum(1); } 

private: 
    bool m_null; 
    unsigned int m_value; 
}; 

Sorumu rephrasing ediyorum: one derleme için çözüm yapar ve neden olabilir beklediğiniz gibi kullanılmalı, ancak aşağıdaki çözümler eksik bir sınıfın kullanılmasıyla ilgili hatalar veriyor? @dyp belirtildiği gibi işlev tanımları sınıf vücut sonra derlenen için

class MyEnum 
{ 
public: 
    // snip... 

    static constexpr const MyEnum two = MyEnum(2); 
    static constexpr const MyEnum three = 3; 

    // snip... 
} 
+1

Üye işlev gövdeleri, sınıf tanımından sonra bulundukları gibi derlenir. Yani, sınıf üye işlev gövdeleri içinde tamamlanır. (Ayrıca bakınız [CWG 1255] (http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_active.html#1255)) – dyp

cevap

9

one çözüm derler. onlar sınıf vücutta yerleştirilir Yani neye one Öte yandan bu

class MyEnum 
{ 
public: 
    static constexpr const MyEnum one(); 
    //... Definition here 
}; //Class is fully defined after here 

inline static constexpr const MyEnum MyEnum::one() { return MyEnum(1); } 
         //Fine here because class is complete ^^^^ 

gibi ilan edilmiştir edilir, sınıf vücutta tanımları derlenmektedir. Dolayısıyla, two ve three derlendiğinde, sınıf henüz tam olarak tanımlanmamıştır.

İlgili konular