2016-03-03 17 views
40

Questo codice mi sta dando errore tipo incompleto. Qual è il problema? Per una classe non è consentito avere istanze di membro statiche statiche? C'è un modo per ottenere lo stesso risultato?Non è possibile che una classe abbia istanze di membro del contesto constex statico?

struct Size 
{ 
    const unsigned int width; 
    const unsigned int height; 

    static constexpr Size big = { 480, 240 }; 

    static constexpr Size small = { 210, 170 }; 

private: 

    Size() = default; 
}; 
+4

Stai chiedendo in particolare riguardo ai membri statici di 'constexpr'? –

+0

@PiotrSkotnicki Sì. Rimuovere la parola chiave non lo fa funzionare comunque. – nyarlathotep108

+1

Una volta rimossa la parola chiave, è possibile inizializzarla fuori dalla classe, suppongo, quando è già un tipo completo –

risposta

38

C'è un modo per ottenere lo stesso risultato?

Con "lo stesso risultato", cosa si intende in particolare il constexpr -ness di Size::big e Size::small? In tal caso forse questo sarebbe abbastanza vicino:

struct Size 
{ 
    const unsigned int width = 0; 
    const unsigned int height = 0; 

    static constexpr Size big() { 
     return Size { 480, 240 }; 
    } 

    static constexpr Size small() { 
     return Size { 210, 170 }; 
    } 

private: 

    constexpr Size() = default; 
    constexpr Size(int w, int h) 
    : width(w),height(h){} 
}; 

static_assert(Size::big().width == 480,""); 
static_assert(Size::small().height == 170,""); 
58

Una classe è permesso di avere un membro statico dello stesso tipo. Tuttavia, una classe è incompleta fino alla fine della sua definizione e un oggetto non può essere definito con tipo incompleto. È possibile dichiarare un oggetto con tipo incompleto e definirlo successivamente dove è completo (fuori dalla classe).

struct Size 
{ 
    const unsigned int width; 
    const unsigned int height; 

    static const Size big; 
    static const Size small; 

private: 

    Size() = default; 
}; 

const Size Size::big = { 480, 240 }; 
const Size Size::small = { 210, 170 }; 

vedono questo qui: http://coliru.stacked-crooked.com/a/f43395e5d08a3952

Questo non funziona per constexpr membri, tuttavia.

+1

Pensi che questo non funzioni per i membri di 'constexpr' perché vietato dallo standard o a causa di un bug del compilatore? – nyarlathotep108

+6

@ nyarlathotep108 Non funziona perché un membro 'static constexpr' deve essere inizializzato in linea. – Brian