Dieser Code wird mit clang 3.7.1 (ohne Diagnose) kompiliert, schlägt aber mit GCC 5.3.0 ( Live-Beispiel ):
%Vor%Die Fehlermeldung von GCC lautet wie folgt:
main.cpp: 13: 16: Fehler: Spezialisierung von 'A' nach Instanziierung Freund Struct A;
Welcher hat Recht und warum? Ist es ein Fehler von GCC / Clang?
Ich denke, das ist der Fehler von gcc.
Eine Template-Friend-Class-Deklaration ist nur eine Deklaration, keine Definition. Die Deklaration der Klassenvorlage ist erlaubt, es sei denn, sie hat einen anderen Klassenschlüssel (siehe N4527 14.5.1.4).
Die Spezialisierung oder Instanziierung kann zweimal oder öfter erfolgen. Explizite Spezialisierung kann nur einmal vorkommen (N4527 14.7.3.6).
Dann ist die Diagnose von gcc seltsam, weil es keine explizite Spezialisierung gibt.
Wir haben einige Template-Namensauflösungsquoten:
%Vor%Jetzt sind die Dinge klar:
%Vor%bezieht sich auf:
%Vor%was ist ... ja, teilweise Spezialisierung (wirklich schwierig).
Also GCC ist hier richtig.
Was Sie wirklich brauchen, ist:
%Vor%