Namenssuche und Überlastungsauflösung sind unterschiedlich. Der Name muss zuerst in einem Bereich gefunden werden, dh wir finden müssen , X
so dass der Name do_stuff
zu aufgelöst wird X::do_stuff
- unabhängig von der Nutzung der Namens - und dann Auflösung wählt zwischen den verschiedenen Erklärungen von Überlastung X::do_stuff
.
Der Prozess ist nicht alle solche Fälle zu identifizieren A::do_stuff
, B::do_stuff
usw. , die sichtbar sind, und dann die Überladungsauflösung unter der Vereinigung , dass zuführen. Stattdessen muss ein einzelner Bereich für den Namen identifiziert werden.
In diesem Code:
struct Baz : public Foo, public Bar
{
void func ()
{
do_stuff (1.1f); // ERROR HERE
}
};
Baz
enthält den Namen nicht do_stuff
, sodass Basisklassen nachgeschlagen werden können. Der Name kommt jedoch in zwei verschiedenen Basen vor, sodass bei der Namenssuche kein Bereich identifiziert werden kann. Wir kommen nie so weit zur Überlastungsauflösung.
Das vorgeschlagene Update in der anderen Antwort funktioniert, da es den Namen do_stuff
in den Bereich von Baz
einführt und außerdem zwei Überladungen für den Namen einführt. Die Namenssuche bestimmt also, dass dies do_stuff
bedeutet, Baz::do_stuff
und dann wählt die Überlastungsauflösung aus den beiden Funktionen aus, die als bekannt sind Baz::do_stuff
.
Abgesehen davon ist das Abschatten eine weitere Folge der Namenssuche (keine Regel an sich). Die Namenssuche wählt den inneren Bereich aus, sodass alles im äußeren Bereich nicht übereinstimmt.
Ein weiterer komplizierender Faktor tritt auf, wenn eine argumentabhängige Suche im Spiel ist. Um es kurz zusammenzufassen: Die Namenssuche wird mehrmals für einen Funktionsaufruf mit Argumenten des Klassentyps durchgeführt - der Basisversion, wie in meiner Antwort beschrieben, und dann erneut für den Typ jedes Arguments. Dann geht die Vereinigung der gefundenen Bereiche in den Überlastsatz. Dies gilt jedoch nicht für Ihr Beispiel, da Ihre Funktion nur Parameter vom integrierten Typ enthält.