Betrachten Sie mein einfaches Beispiel unten:
%Vor% In g ++ kompiliert diese Funktion und druckt 5
wie erwartet. In Clang kann es jedoch nicht mit dem Fehler no member named 'x' in 'Derived'
kompiliert werden. Soweit ich das beurteilen kann, ist dies der richtige Code. Ist etwas falsch mit dem, was ich tue, und wenn nicht, gibt es eine Möglichkeit, diese Arbeit in Clang zu haben?
Wie in den Kommentaren verlinkt, Das Initialisieren eines statischen consExpr-Datenelements der Basisklasse mithilfe eines statischen constexpr-Datenelements der abgeleiteten Klasse legt nahe, dass das clang-Verhalten bis C ++ 14 hier standardkonform ist. Beginnend mit Clang 3.9 kompiliert Ihr Code erfolgreich mit -std=c++1z
.
Ein einfacher möglicher Workaround ist die Verwendung von constexpr-Funktionen anstelle von Werten:
Dies ist wahrscheinlich nicht die Antwort, die jemand suchen würde, aber ich habe das Problem gelöst, indem ich eine dritte Klasse hinzugefügt habe:
%Vor%Es funktioniert wie gewünscht, aber leider hat es nicht wirklich die Vorteile von CRTP!