2016-03-31 10 views
0

Dies ist eine Fortsetzung des Problems, das ich gefunden und beschrieben here.Verwendung der consExpr-Methode für die Template-Parametrisierung in struct

Sagen Sie bitte eine Struktur haben, die eine static constexpr Funktion und einen Typ-Alias ​​für eine std::bitset (oder jede Art Sie Vorlage wollen das Ergebnis der const unter Verwendung des Ausdrucks) enthält, die wie folgt aussieht:

struct ExampleStruct { 
    static constexpr std::size_t Count() noexcept { 
     return 3U; 
    } 
    using Bitset = std::bitset<Count()>; 
}; 

Visuelle Studio 2015 Version 14.0.25029.00 Update 2 RC hebt den Count() Aufruf in rot hervor und erzeugt den Fehler function call must have a constant value in a constant expression.

Wie könnte man dies kompilieren oder ähnliche Ergebnisse erzielen?

Was genau verursacht hier den Fehler? Versucht der Compiler, den Typalias vor der const-Ausdrucksfunktion zu generieren?

EDIT: Die Erklärung dafür, warum das nicht funktioniert, unten gefunden werden kann, aber da niemand zur Verfügung gestellt mögliche Abhilfen, hier sind einige, die ich kam mit:

(1) Bei der Verwendung von Vorlagen speichern Typ Alias ​​zu dieser Art.

template<typename T> 
struct ExampleStruct { 
    using ThisType = ExampleStruct<T>; 
    static constexpr std::size_t Count() noexcept { 
     return 3U; 
    } 
    using Bitset = std::bitset<ThisType::Count()>; 
}; 

(2) Verschieben Count() Funktion außerhalb des Strukturkörpers.

static constexpr std::size_t Count() noexcept { 
    return 3U; 
} 

struct ExampleStruct { 
    using Bitset = std::bitset<Count()>; 
}; 

(3) Ersetzen constexpr Methode mit constexpr Elementvariable.

struct ExampleStruct { 
    static constexpr std::size_t Count = 3U; 
    using Bitset = std::bitset<Count>; 
}; 

(4) Wert speichern in constexpr Elementvariable, und gibt diese aus Count() Methode.

+0

Haben Sie es tatsächlich kompiliert? Verlassen Sie sich nicht auf Intellisense. – ZDF

+0

Ein Versuch, Fehler mit 'Fehler C2975: '_Bits' zu kompilieren: ungültiges Vorlagenargument für 'std :: bitset', erwarteter kompilierbarer Konstantenausdruck ' –

+0

Muss' Count() 'eine Funktion sein? Warum nicht 'statisch constexpr std :: size_t Count = 3U;'? – ZDF

Antwort

2

Sie haben vielleicht bemerkt, dass der Fehler verschwindet, wenn Sie eine oder beide Zeilen außerhalb des Klassenkörpers verschieben. Das Problem, auf das Sie stoßen, ist, dass Klassenfunktionsdefinitionen (sogar Inline-Definitionen) nicht geparst werden, bis nach die gesamte Klassendefinition analysiert wurde; Wenn also der Compiler 10 sieht, wurde zu diesem Zeitpunkt Count deklariert, aber noch nicht definiert, und eine constexpr Funktion, die nicht definiert wurde, kann nicht in einem konstanten Ausdruck verwendet werden - so erhalten Sie den Fehler, den Sie sehen. Leider kenne ich keine gute Lösung oder Workaround dafür.

Verwandte Themen