Problem mit const_cast



  • Hallo!
    die Suchfunktion in meinem Suchbaum ist 2 mal überladen. Einmal gibt sie einen selbstdefinierten, konstanten Iterator zurück oder einen nicht-konstanten.
    Um nicht alles doppelt zu schreiben, will ich einfach das Objekt mit static_cast "consten" und das Ergebnis mit "const_cast" "un-consten".
    In Code:

    // Ruft die Suchfunktion im Rootpointer auf
    const_iterator find(const key_t &k) const {
    	return root_ptr->search(k);
    }
    
    // Ruft die const-Suchfunktion auf
    iterator find(const key_t &k) {
    	return const_cast<iterator>(static_cast<const tree*>(this)->find(k));
    }
    

    Der Iterator schaut so aus:

    // lange Tpl-Liste....
    template <unsigned order, typename key_t, typename payload_t, typename compare_t, typename allocator_t>
    class tree_iterator : public std::iterator<std::bidirectional_iterator_tag, typename node<order, key_t, payload_t, compare_t, allocator_t>::value_type> {
    private:
    	node<order, key_t, payload_t, compare_t, allocator_t> *curr_node;
    	pointer curr_data;
    
    public:
    	// Speichere aktuellen Knoten + Elementadresse
    	tree_iterator(node<order, key_t, payload_t, compare_t, allocator_t> *n, pointer e);
    	tree_iterator(const tree_iterator &ti)
    		: curr_node(ti.curr_node), curr_data(ti.curr_data)
    	{ }
    	tree_iterator();
    
    	value_type& operator *() {
    		return *curr_elem;
    	}
    
    };
    

    Der Compiler sagt:

    error C2440: 'const_cast': 'const tree_iterator<order,key_t,payload_t,compare_t,allocator_t>' kann nicht in 'tree_iterator<order,key_t,payload_t,compare_t,allocator_t>' konvertiert werden
    

    Und als Zusatz:

    Konvertierung erfordert einen Konstruktor oder einen benutzerdefinierten Konvertierungsoperator, der nicht von dem const_cast-Operator oder reinterpret_cast-Operator verwendet werden kann
    

    Was soll das bedeuten? Reicht denn der Kopier-Konstruktor nicht? :xmas2:

    Danke im voraus!


  • Mod

    Ad aCTa schrieb:

    Was soll das bedeuten? Reicht denn der Kopier-Konstruktor nicht? :xmas2:

    const_cast ruft niemals irgenwelchen Funktionen (einschließlich Konstruktoren) auf. Abgesehen davon sind iterator und const_iterator völlig verschiedene Klassen, die nur ganz zufällig einen ähnlichen Namen haben.
    Für deine Zwecke dürfte es am sinnvollsten sein, dem iterator einen Konvertierungsoperator aus const_iterator zu spendieren, der private ist.



  • > Abgesehen davon sind iterator und const_iterator völlig verschiedene Klassen, die nur ganz zufällig einen ähnlichen Namen haben.

    Eigentlich (bei mir) nicht.

    typedef typename tree_iterator<...parameter...> iterator;
    typedef const iterator const_iterator;
    

    Oder verfolgt der Compiler typedefs nicht bis zum eigentlichen Typ zurück? Naja, mit dem Konvertierungsoperator klappts, aber sehr schön finde ich es nicht. Trotzdem vielen dank.
    :xmas1:



  • typedef typename tree_iterator<...parameter...> iterator;
    typedef const iterator const_iterator;
    

    das macht nicht das, was du erwartest...



  • Ach Mist, stimmt. Ich Trottel... :xmas2:
    Dieser Iterator würde ja einem konstanten Zeiger gleichkommen, nicht meine Absicht.
    Ich werden das alles noch mal überdenken, vielen Dank.
    :xmas1:


Anmelden zum Antworten