Im folgenden Beispiel ist Abstract
eine Klassenvorlage, deren erster Parameter ein Typ ist, und der zweite Parameter ist eine andere Vorlage, die ein Bool mit einer beliebigen Anzahl von Argumenten verwendet.
Die Ausgaben von Clang und C ++ sind die folgenden:
Clang Ссылка
Fehler: Klassenvorlage teilweise Spezialisierung ist keine Spezialisierung Vorlagenargument;
G ++ Ссылка
OK
Also entschied ich mich, klingfreundlich zu werden und fügte einen dritten Parameter in Abstract
's Deklaration hinzu.
Nun, sowohl Clang als auch G ++ waren damit einverstanden. Ich vermute, der Grund, warum Clang sich beschwert hat, war, dass die Spezialisierung nichts wirklich Spezialisiert hat. Das stimmt aber nicht. Es ist spezialisiert auf die Anzahl der Argumente.
Als Nächstes fügte ich eine weitere Spezialisierung für den Template-Vorlagenparameter hinzu. Das Beispiel sieht so aus:
%Vor%Die Ausgaben von Clang und C ++ sind die folgenden:
Clang Ссылка
error: Neudefinition von
Abstract<type-parameter-0-0, C, void>
Hinweis: vorherige Definition iststruct Abstract<T,C> : Abstract<T>
G ++: Ссылка
OK - (hat auch den dritten Parameter in der Deklaration nicht benötigt)
Ich glaube nicht, dass Clang genau hier ist, weil die dritte Spezialisierung für das Template-Template-Argument gültig ist, und der Variadic-Template-Parameter erlaubt mir, mich auf eine beliebige Anzahl von Argumenten zu spezialisieren. Ich bin mir jedoch nicht sicher.
Frage: Welcher Compiler ist der Buggy? Warum? Es wäre wirklich nett, ein Zitat aus der Spezifikation und mehr Klarheit zu diesem Thema zu bekommen.
Tags und Links c++ templates language-lawyer c++14