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 werdenUnd als Zusatz:
Konvertierung erfordert einen Konstruktor oder einen benutzerdefinierten Konvertierungsoperator, der nicht von dem const_cast-Operator oder reinterpret_cast-Operator verwendet werden kannWas soll das bedeuten? Reicht denn der Kopier-Konstruktor nicht? :xmas2:
Danke im voraus!
-
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: