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%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).
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:
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::*)()