2015-05-20 9 views
8

Podczas pisania mojego wstępnego pytania, jeśli jest to nawet możliwe, natknąłem się na pytanie static constexpr member of same type as class being defined, które dość wyraźnie odpowiedziało, że moje czyste rozwiązanie nie jest możliwe w C++ 11.Statyczne elementy constexpr tego samego typu, co zdefiniowana klasa (szczegóły dodatkowe)

Ale potem przyszedł z tym kodem, który jest dość blisko do oryginalnego plakatu i chcę osiągnąć:

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; 
}; 

Więc jestem przeformułowanie moje pytanie: Dlaczego rozwiązanie dla one kompilacji i może być używane tak, jak byś tego oczekiwał, ale poniższe rozwiązania dają błędy związane z używaniem niekompletnej klasy?

class MyEnum 
{ 
public: 
    // snip... 

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

    // snip... 
} 
+1

Ciała funkcji składowych są kompilowane tak, jakby znajdowały się po definicji klasy. Oznacza to, że klasa jest kompletna w obrębie ciał funkcji członkowskich. (Zobacz także [CWG 1255] (http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_active.html#1255)) – dyp

Odpowiedz

9

@dyp Jak wspomniano rozwiązanie one zestawia ponieważ definicje funkcji są opracowywane na korpusie klasy. Tak to jest jak one został ogłoszony jak ten

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 ^^^^ 

Z drugiej strony, definicje w ciele klasy są zestawiane są one umieszczone w ciele klasy. Tak więc podczas kompilowania two i three klasa nie jest jeszcze w pełni zdefiniowana.

Powiązane problemy