Der folgende Code, der die Friend-Deklaration enthält, schlägt mit dem angegebenen Fehler fehl (siehe Ссылка ):
%Vor%Wenn die Reihenfolge der Deklaration von Freunden und der Deklaration von Mitgliederfunktionen umgekehrt wird, wird der Code ohne Probleme kompiliert (siehe Ссылка ):
%Vor%Dies passiert nicht, wenn die Friend-Deklaration keine Template-Spezialisierung enthält: Nicht-Template-Freunde sind in Ordnung, ebenso wie eine Template-Freundesliste. Durch die Verwendung des qualifizierten Namens in der Vorlagenspezialisierung kann Code kompiliert werden. Meine Frage ist warum schlägt das erste Beispiel fehl? Es sieht so aus, als würde der Compiler Namen im Klassenraum an der Stelle der Friend-Deklaration und nur für die Template-Spezialisierung nachschlagen? Wo im Standard ist dieses Verhalten angegeben?
Um es explizit zu machen, dass es die Funktion ist, der Sie% friend
vorgeben wollen, fügen Sie den Funktionsnamen mit ::
voran, um zu sagen, dass es sich im globalen Namespace befindet.
Snippet, das kompiliert und tut, was Sie wollen:
%Vor%3.4 / 9 Namenssuche
Namenssuche nach einem Namen, der in der Definition einer Friend-Funktion verwendet wird (11.4) in der Klasse definiert werden, die Freundschaft gewährt, soll als beschrieben für die Suche in Memberfunktionsdefinitionen. Wenn der Freund Funktion ist nicht definiert in der Klasse, die Freundschaft gewährt, Namenssuche in der Freund-Funktion soll die Definition wie für das Nachschlagen beschrieben erfolgen in Namespace-Member-Funktionsdefinitionen
Ihr Snippet kann nicht kompiliert werden, weil der folgende Code nicht kompiliert werden kann.
%Vor%...
14.5.3 Freunde [temp.friend] 1
Ein Freund einer Klassen- oder Klassenvorlage kann eine Funktionsvorlage oder Klassenvorlage sein, eine Spezialisierung von a Funktionsvorlage oder Klassenvorlage oder eine gewöhnliche Vorlage (keine Vorlage) Funktion oder Klasse. Für eine Friend-Funktionsdeklaration, die keine ist Vorlage Deklaration:
- wenn der Name des Freundes qualifiziert ist oder unqualifizierte Template-ID bezieht sich die Friend-Deklaration auf a Spezialisierung einer Funktionsvorlage, sonst
- wenn der Name des Freund ist eine qualifizierte ID und eine passende Nicht-Template-Funktion wird gefunden In der angegebenen Klasse oder dem angegebenen Namespace bezieht sich die Friend-Deklaration auf diese Funktion andernfalls
- wenn der Name des Freundes eine qualifizierte ID ist und eine passende Spezialisierung einer Funktionsvorlage findet sich in der Spezifizierte Klasse oder Namespace, auf die sich die Friend-Deklaration bezieht Funktion Template-Spezialisierung, andernfalls
- Der Name soll ein sein unquali fi ed-id, das ein gewöhnliches (nicht-Template) deklariert (oder deklariert) Funktion.
Tags und Links c++ templates language-lawyer name-lookup friend