Kann ein Template-Template-Parameter standardmäßig auf andere Template-Typ-Parameter verweisen?

8

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?

    
Aaron 12.09.2014, 14:58
quelle

2 Antworten

1

Abhängig von Ihrer Definition von "ähnlich" könnten Sie Ihre B Vorlagendefinition in

ändern %Vor%

und innerhalb von struct B können Sie auf die innere Vorlage als

zugreifen %Vor%

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.

    
Dalibor Frivaldsky 12.09.2014, 16:19
quelle
2

Ihr Code ist kein gültiger C ++ - Code. Siehe die folgenden Zitate.

C ++ 03

  

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 a qualified-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üsselwort template darf nicht auf Nicht-Template-Mitglieder von Klassenvorlagen angewendet werden.] Darüber hinaus darf den Namen von Elementvorlagen nicht das Schlüsselwort template vorangestellt werden, wenn Postfix-Ausdruck oder qualifizierte-ID erscheint nicht im Bereich einer Vorlage. [ Hinweis: Genau wie beim Präfix typename ist das Präfix template 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.]

C ++ 11

  

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äfix template haben. Andernfalls wird angenommen, dass der Name ein Nicht-Template bezeichnet.

     

14.2 / 5

     

Ein Name mit dem Präfix template soll eine Template-ID sein oder der Name soll sich auf eine Klassenvorlage beziehen. [ Hinweis: Das Schlüsselwort template wird möglicherweise nicht auf Nichtvorlagenelemente von Klassenvorlagen angewendet. - Endnote ] [ Hinweis: Wie im Falle des Präfix typename ist das Präfix template 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:

%Vor%      

- Beispiel beenden ]

Standardkonformer Code

Die korrekte Syntax in dieser Situation lautet also:

%Vor%

Leider VC2010 versteht auch die gültige Syntax nicht.

    
Constructor 12.09.2014 18:30
quelle