const ref auf ptr



  • Hallo,

    eine Frage aus Interesse:
    Ich habe eine Containerklasse, die das Sortieren durch Übergabe eines "Predicate"/Funktors unterstützt. Dieses Predicate muss von einer abstrakten Predicate-Klasse abgeleitet werden, die den operator() folgendermaßen deklariert:

    virtual bool operator() (const T& t1, const T& t2) const = 0;
    

    Der Container, den ich sortieren möchte, enthält nun Zeiger, d.h. der Template-Parameter ist vom Typ MyClass*.

    Mit Hilfe eines typedef lässt sich alles recht einfach bewerkstelligen:

    typedef MyClass* myPtr;
    virtual bool operator()(const myPtr& p1, const myPtr& p2) const
    {
        // Implementation
    }
    

    Folgendes müsste aus meiner Sicht ebenfalls funktionieren

    virtual bool operator()(MyClass* const& p1, MyClass* const& p2) const
    {
        // Implementation
    }
    

    weil

    const MyClass& obj
    

    gleichwertig ist zu

    MyClass const& obj
    

    Das ist richtig, oder? (Der Compiler hat jedenfalls nichts zu meckern.)

    Allerdings bekomme ich es auch durch Klammersetzung nicht hin, die (mir) vertraute Schreibweise zu verwenden, ohne ein typedef zu benutzen. Also etwas in dieser Art:

    virtual bool operator()(const MyClass*& p1, const MyClass*& p2) const
    {
        // Implementation
    }
    

    In dieser Form erkennt der Compiler das nicht als überschriebene Version der Basisklasse an.
    Muss ich tatsächlich auf eine der beiden erstgenannten Varianten zurückgreifen?

    Wie gesagt, das ist nur eine technische Frage aus Interesse.
    Danke schonmal vorab!



  • Muss ich tatsächlich auf eine der beiden erstgenannten Varianten zurückgreifen?

    Ja. const bezieht sich normalerweise auf das, was direkt links davon steht, deshalb schreibst du Foo * const & für eine Referenz auf einen konstanten Zeiger auf Foo. Nur wenn das const ganz links steht, bezieht es sich auf das unmittelbar rechts davon. Das dürfte hauptsächlich historische Gründe haben, es ist IMO guter Stil, diese Form, die du als "vertraut" bezeichnest, überhaupt nicht zu verwenden.



  • Vielen Dank für die schnelle Antwort!



  • refptr schrieb:

    virtual bool operator()(MyClass* const& p1, MyClass* const& p2) const
    {
        // Implementation
    }
    

    Referenz auf Konstanten Zeiger auf ein Objekt vom Typ MyClass.

    refptr schrieb:

    virtual bool operator()(const MyClass*& p1, const MyClass*& p2) const
    {
        // Implementation
    }
    

    Referenz auf Zeiger auf ein konstantes Objekt vom Typ MyClass. Der Zeiger (also T) ist nicht konstant ;), sondern nur sein Pointee.


Anmelden zum Antworten