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 vererbt
    

    Fehlermeldung:
    : 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


  • Administrator

    Die Funktion IHandle<T>::get ist nicht konstant. Mach die konstant, dann geht dein Code und ich nehme schwer an, dass die Funktion auch konstant gemacht werden kann 😉

    Grüssli


Anmelden zum Antworten