Übergeben einer Superklassenfunktion als Template-Parameter ohne Typenname

8

Angenommen, Sie haben

%Vor%

warum macht

%Vor%

arbeite aber

%Vor%

nicht, beschweren sich

%Vor%

?

( Call<A,&A::f> funktioniert eindeutig)

Auf ähnliche Weise

%Vor%

gibt

%Vor%     
Fabio Dalla Libera 21.06.2012, 12:06
quelle

2 Antworten

4
%Vor%

funktioniert wegen impliziter Konvertierung von

%Vor%

bis

%Vor%

wird angewendet.

4.11 (2)

Ein Prvalue vom Typ "Zeiger auf Member von B vom Typ cv T", wobei B ein Klassentyp ist, kann in a konvertiert werden Prvalue vom Typ "Zeiger auf Member von D vom Typ cv T", wobei D eine abgeleitete Klasse (Abschnitt 10) von B ist.

Der Standard lässt jedoch keine Konvertierungen für den Zeiger zur Elementfunktion in Vorlagenargumenten zu, mit Ausnahme der nullptr_t-Konvertierung:

14.3.2

Für einen nicht-type Template-Parameter vom Typ pointer to member function, wenn das Template-Argument von ist Geben Sie std :: nullptr_t ein, wird die Nullelementzeigerkonvertierung (4.11) angewendet. Ansonsten keine Conversions sich bewerben. Wenn das Template-Argument eine Gruppe von überladenen Member-Funktionen darstellt, das passende Mitglied Funktion wird aus der Menge ausgewählt (13.4).

    
user396672 21.06.2012, 14:03
quelle
0

Der Fehler gibt genau an, was falsch ist, void (A::*)() und void (B::*)() sind unterschiedliche Typen.

Während es in diesem Fall so aussieht, als ob es einfach sein sollte, wird der allgemeine Fall viel komplexer. Überlegen Sie, was passieren würde, wenn A mehrere virtuelle Funktionen und B mehrfache Vererbung hätte. Zeiger auf Elementfunktionen sind sehr komplexe Bestien, weil sie solche Dinge erklären müssen. Werfen Sie einen Blick auf Ссылка

Sie könnten B zu:

ändern %Vor%

So dass B::f() tatsächlich existiert. Derzeit ist B::f() ein Alias ​​von A::f() , der offensichtlich vom Typ void (A::*)() und nicht void (B::*)()

ist     
IronMensan 21.06.2012 13:12
quelle

Tags und Links