Frage zu Effektiv c++ Programmieren, Konstruktor Template
-
Hi, ich versuche mich gerade an einem Kapitel im oben genannten Buch, wo einem intelligenten Zeiger über ein Copy Constructor die Umwandlung in eine andere Instantiierung gleichen Templates erlaubt wird, allerdings nur so, dass das Konvertierungsverhalten eines normalen Zeigers nachgeahmt wird. Aber irgendwie bekomm ich meinen Code nicht zum laufen. Habe mir Teile von shared_ptr angeguckt, jedoch ohne Erfolg
meine Konstruktoren:
template<typename U> explicit IHandle ( U* pt ) try : ptr( pt ), ref_counter( new size_type(1)) { } catch( std::bad_alloc&) { } template<typename U> IHandle( const IHandle<U>& orig ) : ptr( orig.get() ), ref_counter( orig.refcounter ) { ++*ref_counter; } IHandle( const IHandle& orig ) : ptr( orig.get() ), ref_counter( orig.ref_counter ) { ++*ref_counter; } // in main IHandle<Base> pt = IHandle<Derived>(new Derived); //wobei Base und Derived inhaltlose Klassen sind, öffentlich vererbtFehlermeldung:
: error C2662: 'nsHandle::IHandle<T>::get': this-Zeiger kann nicht von 'const nsHandle::IHandle<T>' in 'nsHandle::IHandle<T> &' konvertiert werden
1> with
1> [
1> T=Derived
1> ]
1> Durch die Konvertierung gehen Qualifizierer verloren
1> Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "nsHandle::IHandle<T>::IHandle<Derived>(const nsHandle::IHandle<Derived> &)".
1> with
1> [
1> T=Base
1> ]kann mir jemand helfen?
Gruss
Chris
-
Die Funktion
IHandle<T>::getist nicht konstant. Mach die konstant, dann geht dein Code und ich nehme schwer an, dass die Funktion auch konstant gemacht werden kann
Grüssli