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& objgleichwertig ist zu
MyClass const& objDas 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.
constbezieht sich normalerweise auf das, was direkt links davon steht, deshalb schreibst duFoo * const &für eine Referenz auf einen konstanten Zeiger auf Foo. Nur wenn dasconstganz 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.