Das liegt daran, dass innerhalb des Körpers der Klasse Test<Writer>
die Benennung von Test
ohne Angabe der Vorlagenargumente automatisch die gleichen Argumente annimmt (z. B. Writer
).
Beispielsweise können Sie den Kopierkonstruktor wie folgt schreiben:
%Vor%statt
%Vor% Sie können dies umgehen, indem Sie Test
mit seinem Namespace, z. B.
HINWEIS: Wie Tomalek vorschlägt, ist die ursprüngliche Verwendung in C ++ 0x gültig. Hier ist der relevante Absatz des Standards (Hervorhebung von mir), aus Abschnitt 14.6.1 ( [temp.local]
):
Wie normale (Nicht-Template-) Klassen haben Klassenvorlagen einen injected-class-name (Klausel 9). Der eingegebene Klassenname kann als Vorlagenname oder Typname verwendet werden. Bei Verwendung mit einer -Template-Argumentliste , als -Template-Argument für einen Template Template-Parameter oder als endgültiger Bezeichner im elaborated-type-specifier einer Friend-Class-Template-Deklaration, bezieht sich auf die Klassenvorlage selbst . Ansonsten entspricht dies dem Schablonennamen , gefolgt von den Schablonen-Parametern der Klassenschablone, die in & lt; & gt;.
eingeschlossen ist
@Ben ist wahrscheinlich richtig, aber hier ist ein völlig anderer Weg, um es zu kompilieren, das keine Vorlagen als Argumente für Vorlagen verwendet.
%Vor%Ich habe zwei Änderungen vorgenommen. @Hugo, vielleicht ist das was du wolltest, und vielleicht haben ältere Versionen von g ++ das?
Es ist einfach, Code zum Kompilieren zu bekommen, aber das bedeutet nicht, dass er das tut, was er zu tun glaubt!