2016-03-03 1 views
40

Ce code me donne erreur de type incomplet. Quel est le problème? N'est-il pas permis à une classe d'avoir instances de membre statiques de lui-même? Existe-t-il un moyen d'obtenir le même résultat?Une classe ne peut-elle pas contenir d'instances de membre constexpr statiques?

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

Demandez-vous spécifiquement sur les membres statiques 'constexpr'? –

+0

@PiotrSkotnicki Oui. Supprimer le mot-clé does'n le fait quand même fonctionner. – nyarlathotep108

+1

Une fois que vous supprimez le mot-clé, vous pouvez l'initialiser à l'extérieur de la classe, quand il est déjà complet –

Répondre

38

Existe-t-il un moyen d'obtenir le même résultat?

Par « le même résultat », comptez-vous spécifiquement la constexpr ness de Size::big et Size::small? Dans ce cas peut-être ce serait assez proche:

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

Une classe est autorisé à avoir un organe statique du même type. Cependant, une classe est incomplète jusqu'à la fin de sa définition et un objet ne peut pas être défini avec un type incomplet. Vous pouvez déclarer un objet avec un type incomplet, et le définir plus tard où il est complet (en dehors de la 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 }; 

voir ce ici: http://coliru.stacked-crooked.com/a/f43395e5d08a3952

Cela ne fonctionne pas pour constexpr membres, cependant.

+1

Pensez-vous que cela ne fonctionne pas pour les membres 'constexpr' car interdit par le standard ou à cause d'un bogue du compilateur? – nyarlathotep108

+6

@ nyarlathotep108 Cela ne fonctionne pas car un membre 'static constexpr' doit être initialisé en ligne. – Brian