Friend-Deklaration der Template-Spezialisierung schlägt fehl

8

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?

    
Gene Bushuyev 15.12.2011, 03:48
quelle

1 Antwort

7

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%

n1905.pdf

  

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.

    
Filip Roséen - refp 15.12.2011 03:50
quelle