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.
Haben Sie es tatsächlich kompiliert? Verlassen Sie sich nicht auf Intellisense. – ZDF
Ein Versuch, Fehler mit 'Fehler C2975: '_Bits' zu kompilieren: ungültiges Vorlagenargument für 'std :: bitset', erwarteter kompilierbarer Konstantenausdruck ' –
Muss' Count() 'eine Funktion sein? Warum nicht 'statisch constexpr std :: size_t Count = 3U;'? – ZDF