Mit C ++ 11's stark typisierten enum
s ist es möglich, eine Member-Enumeration einer Klasse wie folgt zu deklarieren:
Wenn Sie X
jedoch zu einer Klassenvorlage machen:
gcc 4.7.2 und clang 3.0 beschweren sich beide mit "error: 'enum X :: E' ist eine Enumerationsvorlage [-pedantic]" und "error: enumeration kann keine Vorlage sein". Der Abschnitt des Standards, der meiner Meinung nach relevant ist (und aus dem diese Frage eigentlich stammt), ist §14 Vorlagen, deren erster Absatz lautet:
Die Deklaration in einer Template-Deklaration muss
sein
- deklarieren oder definieren Sie eine Funktion oder eine Klasse oder
- definiere eine Memberfunktion, eine Memberklasse, eine Memberauflistung oder ein statisches Datenmember einer Klassenvorlage oder einer in eine Klasse geschachtelten Klasse Klassenvorlage oder
- Definieren Sie eine Mitgliedervorlage einer Klassen- oder Klassenvorlage oder
- sei eine Alias-Deklaration .
(Betonung meiner). Ist das also ein Compiler Bug, oder interpretiere ich die Aussage komplett falsch?
Ich wurde gebeten, diese Antwort zu erstellen. Siehe Abschnitt [temp.mem.enum] 14.5.1.4/1 des C ++ - Standards:
Ein Aufzählungselement einer Klassenvorlage kann außerhalb der Klasse definiert werden Klassenvorlagedefinition. [ Beispiel:
%Vor%-Endbeispiel ]
Neuere Version von clang (3.4) kompiliert Ihren Code erfolgreich mit dem Flag -pedantic-errors
, wohingegen gcc 4.8.1 betrachtet es immer noch als Fehler . Ich denke, es ist ein gcc Bug.
Tags und Links c++ c++11 enums templates forward-declaration