Überladen von Funktionen



  • void F(int i) {
      static_cast<void>(i);
    }
    
    class Test {
    public:
      void F() {
        F(1);  // 'Test::F': Funktion akzeptiert keine 1 Argumente
        // ::F(1);  // OK
      }
    };
    

    Aus welchem Grund benötige ich den ::Operator, um auf F(int) von class T aus zuzugreifen? Funktionsüberladung scheint nicht aus Klassen heraus zu funktionieren, weshalb?



  • Du Überlädst hier in keinster Weise die Funktion F( int i ).
    Die Funktion F() inerhalb der Klasse hat nämlich einen anderen, vollständig qualifizierten Namen: "Test::F().
    Das Schlagwort, das du suchst ist Gültigkeitsbereich und Sichtbarkeit.



  • Überladung funktioniert immer nur innerhalb eines Scopes, deshalb wird für den Aufruf von F in der Klasse, nachdem bereits eine Funktion namens F in der Klasse gefunden wurde, nicht mehr weiter außerhalb nach anderen F's gesucht.

    BTW:

    // urgs
    void F(int i) {
      static_cast<void>(i);
    }
    
    // ==>
    
    void F(int) {
    }
    


  • Bashar schrieb:

    Überladung funktioniert immer nur innerhalb eines Scopes ...

    Danke, das war mir nicht bekannt!


  • Mod

    Bashar schrieb:

    Überladung funktioniert immer nur innerhalb eines Scopes, deshalb wird für den Aufruf von F in der Klasse, nachdem bereits eine Funktion namens F in der Klasse gefunden wurde, nicht mehr weiter außerhalb nach anderen F's gesucht.

    Die könnte allerdings per adl gefunden werden.

    struct foo : Test
    {
        void bar() { F(*this); } // findet Test::f per unqualiziertem Lookup und ::F per adl
        operator int() { return 42; }
    };
    


  • camper schrieb:

    Bashar schrieb:

    Überladung funktioniert immer nur innerhalb eines Scopes, deshalb wird für den Aufruf von F in der Klasse, nachdem bereits eine Funktion namens F in der Klasse gefunden wurde, nicht mehr weiter außerhalb nach anderen F's gesucht.

    Die könnte allerdings per adl gefunden werden.

    struct foo : Test
    {
        void bar() { F(*this); } // findet Test::f per unqualiziertem Lookup und ::F per adl
        operator int() { return 42; }
    };
    

    Ich glaube, das ist nicht ganz richtig. Ausprobiert habe ich es jetzt nicht, aber §3.4.2/3 sagt, dass wenn die "normale" unqualifizierte Namenssuche (also ohne ADL) eine Elementfunktion findet, dass dann das per ADL produzierte "lookup set" leer ist. So, wie ich das verstehe, schließt das auch Elementfunktionen aus Basisklassen ein. Dieser Test bestätigt das.

    In Deinem Fall ist Test::F ja eine Elementfunktion, die per "normalem" Namelookup gefunden wird. Demnach wäre ::F nicht in dem von per ADL produzierten "lookup set".


  • Mod

    ah, stimmt.


Anmelden zum Antworten