Vererbung und Template-Betreiber ÜberlastungVererbung und Template-Operator Überlastung
Ich verstehe nicht, warum der Bediener in A<int>
den Bediener in base
den Schatten stellt. Es hat schließlich eine andere Unterschrift.
#include <iostream>
struct base {
template <typename U>
void operator()(U&& x) { std::cout << "base" << std::endl; }
};
template <typename T>
struct A: public base { };
template <>
struct A<int>: public base {
void operator()() { std::cout << "A<int>" << std::endl; } // line 1
};
int main()
{
A<double>()(1);
A<int>()(1); // line 2
A<int>()(); // line 3
}
Zeile 2 wird nicht kompiliert, wenn Zeile 1 vorhanden ist.
Zeile 3 wird nicht kompiliert, wenn Zeile 1 (offensichtlich) entfernt wird.
Wenn ich die Operatorvorlage von Base nach A kopiere, funktioniert alles.
erwartete ich die Ausgabe zu sein:
base
base
A<int>
Es heißt * Name Verbergen *. Siehe z.B. http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of-the –
Sie können das Problem lösen, indem Sie 'using base einfügen :: operator(); 'in Ihrer Klasse A. Beachten Sie, dass die Barrierefreiheit davon abhängt, wo Sie Ihre Verwendungsdeklarationen einfügen und dass Sie die Barrierefreiheit in Bezug auf die der Eltern ändern können (z. B. geschützte Funktionen öffentlich machen) Sektion). – Aconcagua
Und beachten Sie, dass Sie eine einzelne Funktion auf diese Weise nicht "einblenden" können - entweder alle Überladungen oder keine (Ausnahme: es gibt nur eine Funktion mit einem gegebenen Namen im Elternteil ...). – Aconcagua