Ich versuche etwas wie das Folgende zu tun:
%Vor%Aber der Visual Studio 2010-Compiler spuckt aus:
Fehler C3202: 'AA': ungültiges Standardargument für den Template-Parameter '', erwartet eine Klassenvorlage
Wenn ich B durch die folgende Vorlage ersetze:
%Vor%der Code kompiliert gut, aber ist nicht was ich will. Wenn das Original kein legales C ++ ist, gibt es eine Alternative, die eine ähnliche Schnittstelle für Benutzer der Vorlage "B" bietet?
Abhängig von Ihrer Definition von "ähnlich" könnten Sie Ihre B
Vorlagendefinition in
und innerhalb von struct B
können Sie auf die innere Vorlage als
Ihre Benutzer müssten jedoch die in einer Klasse enthaltene AA-ähnliche Vorlage bereitstellen, genauso wie Ihre struct A
.
Sie können auch Ihre Anforderungen an die Compilerkompatibilität senken und MSVC 2013 + benötigen.
Ihr Code ist kein gültiger C ++ - Code. Siehe die folgenden Zitate.
14.2 Namen von Vorlagenspezialisierungen [Temp.Name]
14.2 / 4
Wenn der Name einer Elementvorlagenspezialisierung nach
.
oder->
in einem postfix-ausdruck oder nach geschachtelten Namenspezifizierer in aqualified-id , und der Postfix-Ausdruck oder die qualifizierte ID hängt explizit von einem Template-Parameter ab (14.6.2), der Name der Member-Vorlage muss das Präfix template
haben. Andernfalls wird angenommen, dass der Name ein Nicht-Template bezeichnet.14.2 / 5
Wenn ein Name mit dem Präfix
template
nicht der Name einer Elementvorlage ist, ist das Programm schlecht formatiert. [ Hinweis: Das Schlüsselworttemplate
darf nicht auf Nicht-Template-Mitglieder von Klassenvorlagen angewendet werden.] Darüber hinaus darf den Namen von Elementvorlagen nicht das Schlüsselworttemplate
vorangestellt werden, wenn Postfix-Ausdruck oder qualifizierte-ID erscheint nicht im Bereich einer Vorlage. [ Hinweis: Genau wie beim Präfixtypename
ist das Präfixtemplate
in Fällen zulässig, in denen dies nicht unbedingt erforderlich ist. dh wenn der Ausdruck links von->
oder.
oder der geschachtelte Name-Spezifizierer nicht von einem Template-Parameter abhängt.]
14.2 Namen von Vorlagenspezialisierungen [Temp.Name]
14.2 / 4
Wenn der Name einer Member Template-Spezialisierung nach
.
oder->
in einem Postfix-Ausdruck oder nach einem geschachtelten Namen-Spezifizierer in einem < em> qualified-id , und der Objektausdruck des postfix-expressions ist typabhängig oder der geschachtelte Namensspezifizierer in der qualifizierte -id verweist auf einen abhängigen Typ, aber der Name ist kein Mitglied der aktuellen Instanziierung (14.6.2.1), der Name der Elementvorlage muss das Präfixtemplate
haben. Andernfalls wird angenommen, dass der Name ein Nicht-Template bezeichnet.14.2 / 5
Ein Name mit dem Präfix
%Vor%template
soll eine Template-ID sein oder der Name soll sich auf eine Klassenvorlage beziehen. [ Hinweis: Das Schlüsselworttemplate
wird möglicherweise nicht auf Nichtvorlagenelemente von Klassenvorlagen angewendet. - Endnote ] [ Hinweis: Wie im Falle des Präfixtypename
ist das Präfixtemplate
in Fällen zulässig, in denen dies nicht unbedingt erforderlich ist. Das heißt, wenn der verschachtelte Name-Specifier oder der Ausdruck links von->
oder.
nicht von einem Template-Parameter oder der Verwendung abhängt erscheint nicht im Rahmen einer Vorlage. - Endnote ] [ Beispiel:- Beispiel beenden ]
Die korrekte Syntax in dieser Situation lautet also:
%Vor%Leider VC2010 versteht auch die gültige Syntax nicht.
Tags und Links c++ templates template-templates