2014-09-17 4 views
10

Kann jemand versuchen, das zu erklären?Seltsames conetexpr Verhalten für innere Klasse

template<typename T, size_t S = T::noElems()> 
struct C 
{ 
}; 

struct X 
{ 
    enum E { A, B, C }; 
    static constexpr size_t noElems() { return C+1; }; 
}; 

struct K 
{ 
    C<X> cx; // this DOES compile 
}; 

struct Y 
{ 
    struct Z 
    { 
     enum E { A, B, C }; 
     static constexpr size_t noElems() { return C+1; }; 
    }; 
    C<Z, Z::C+1> cyz; // this DOES compile 

    C<Z> cyz; // <--- this does NOT compile 
}; 
+0

Clang beschwert 'undefined Funktion‚noElems‘kann nicht in einem konstanten expression' verwendet werden –

+2

ich denke, es könnte beantwortet werden [hier] (http://stackoverflow.com/a/8108406/4035785) –

+0

Können Sie die Zusammenstellung hinzufügen Fehler in deine Frage? – Angew

Antwort

5

Mit der Erklärung der Struktur

struct Y 
{ 
    struct Z 
    { 
     enum E { A, B, C }; 
     static constexpr size_t noElems() { return C+1; }; 
    }; 
    C<Z, Z::C+1> cyz1; // this DOES compile 

    C<Z> cyz2; // <--- this does NOT compile 
}; 

Einheiten cyz1 und cyz2 vor Inline-Deklaration von Z::noElems() analysiert werden, so die Definition von

static constexpr size_t noElems() { return C+1; }; 

ist zur Zeit nicht verfügbar von Erklärung von

.210
+0

+1 Schöne Antwort. Ich frage mich, wie Z :: C dann verfügbar ist. – gd1

+1

Ich editiere meine Antwort, ich denke es geht darum, dass NoElems inline ist, was den Compiler dazu bringt, es nach den cyz Deklarationen zu analysieren, während enum E verfügbar ist, deshalb arbeitet cyz1 –