<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem mit const_cast]]></title><description><![CDATA[<p>Hallo!<br />
die Suchfunktion in meinem Suchbaum ist 2 mal überladen. Einmal gibt sie einen selbstdefinierten, konstanten Iterator zurück oder einen nicht-konstanten.<br />
Um nicht alles doppelt zu schreiben, will ich einfach das Objekt mit static_cast &quot;consten&quot; und das Ergebnis mit &quot;const_cast&quot; &quot;un-consten&quot;.<br />
In Code:</p>
<pre><code class="language-cpp">// Ruft die Suchfunktion im Rootpointer auf
const_iterator find(const key_t &amp;k) const {
	return root_ptr-&gt;search(k);
}

// Ruft die const-Suchfunktion auf
iterator find(const key_t &amp;k) {
	return const_cast&lt;iterator&gt;(static_cast&lt;const tree*&gt;(this)-&gt;find(k));
}
</code></pre>
<p>Der Iterator schaut so aus:</p>
<pre><code class="language-cpp">// lange Tpl-Liste....
template &lt;unsigned order, typename key_t, typename payload_t, typename compare_t, typename allocator_t&gt;
class tree_iterator : public std::iterator&lt;std::bidirectional_iterator_tag, typename node&lt;order, key_t, payload_t, compare_t, allocator_t&gt;::value_type&gt; {
private:
	node&lt;order, key_t, payload_t, compare_t, allocator_t&gt; *curr_node;
	pointer curr_data;

public:
	// Speichere aktuellen Knoten + Elementadresse
	tree_iterator(node&lt;order, key_t, payload_t, compare_t, allocator_t&gt; *n, pointer e);
	tree_iterator(const tree_iterator &amp;ti)
		: curr_node(ti.curr_node), curr_data(ti.curr_data)
	{ }
	tree_iterator();

	value_type&amp; operator *() {
		return *curr_elem;
	}

};
</code></pre>
<p>Der Compiler sagt:</p>
<pre><code>error C2440: 'const_cast': 'const tree_iterator&lt;order,key_t,payload_t,compare_t,allocator_t&gt;' kann nicht in 'tree_iterator&lt;order,key_t,payload_t,compare_t,allocator_t&gt;' konvertiert werden
</code></pre>
<p>Und als Zusatz:</p>
<pre><code>Konvertierung erfordert einen Konstruktor oder einen benutzerdefinierten Konvertierungsoperator, der nicht von dem const_cast-Operator oder reinterpret_cast-Operator verwendet werden kann
</code></pre>
<p>Was soll das bedeuten? Reicht denn der Kopier-Konstruktor nicht? :xmas2:</p>
<p>Danke im voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/256071/problem-mit-const_cast</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 17:33:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256071.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Dec 2009 19:36:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit const_cast on Mon, 07 Dec 2009 19:36:42 GMT]]></title><description><![CDATA[<p>Hallo!<br />
die Suchfunktion in meinem Suchbaum ist 2 mal überladen. Einmal gibt sie einen selbstdefinierten, konstanten Iterator zurück oder einen nicht-konstanten.<br />
Um nicht alles doppelt zu schreiben, will ich einfach das Objekt mit static_cast &quot;consten&quot; und das Ergebnis mit &quot;const_cast&quot; &quot;un-consten&quot;.<br />
In Code:</p>
<pre><code class="language-cpp">// Ruft die Suchfunktion im Rootpointer auf
const_iterator find(const key_t &amp;k) const {
	return root_ptr-&gt;search(k);
}

// Ruft die const-Suchfunktion auf
iterator find(const key_t &amp;k) {
	return const_cast&lt;iterator&gt;(static_cast&lt;const tree*&gt;(this)-&gt;find(k));
}
</code></pre>
<p>Der Iterator schaut so aus:</p>
<pre><code class="language-cpp">// lange Tpl-Liste....
template &lt;unsigned order, typename key_t, typename payload_t, typename compare_t, typename allocator_t&gt;
class tree_iterator : public std::iterator&lt;std::bidirectional_iterator_tag, typename node&lt;order, key_t, payload_t, compare_t, allocator_t&gt;::value_type&gt; {
private:
	node&lt;order, key_t, payload_t, compare_t, allocator_t&gt; *curr_node;
	pointer curr_data;

public:
	// Speichere aktuellen Knoten + Elementadresse
	tree_iterator(node&lt;order, key_t, payload_t, compare_t, allocator_t&gt; *n, pointer e);
	tree_iterator(const tree_iterator &amp;ti)
		: curr_node(ti.curr_node), curr_data(ti.curr_data)
	{ }
	tree_iterator();

	value_type&amp; operator *() {
		return *curr_elem;
	}

};
</code></pre>
<p>Der Compiler sagt:</p>
<pre><code>error C2440: 'const_cast': 'const tree_iterator&lt;order,key_t,payload_t,compare_t,allocator_t&gt;' kann nicht in 'tree_iterator&lt;order,key_t,payload_t,compare_t,allocator_t&gt;' konvertiert werden
</code></pre>
<p>Und als Zusatz:</p>
<pre><code>Konvertierung erfordert einen Konstruktor oder einen benutzerdefinierten Konvertierungsoperator, der nicht von dem const_cast-Operator oder reinterpret_cast-Operator verwendet werden kann
</code></pre>
<p>Was soll das bedeuten? Reicht denn der Kopier-Konstruktor nicht? :xmas2:</p>
<p>Danke im voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819219</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Mon, 07 Dec 2009 19:36:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit const_cast on Mon, 07 Dec 2009 20:43:41 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Was soll das bedeuten? Reicht denn der Kopier-Konstruktor nicht? :xmas2:</p>
</blockquote>
<p>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.<br />
Für deine Zwecke dürfte es am sinnvollsten sein, dem iterator einen Konvertierungsoperator aus const_iterator zu spendieren, der private ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819272</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 07 Dec 2009 20:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit const_cast on Mon, 07 Dec 2009 21:49:10 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; Abgesehen davon sind iterator und const_iterator völlig verschiedene Klassen, die nur ganz zufällig einen ähnlichen Namen haben.</p>
</blockquote>
<p>Eigentlich (bei mir) nicht.</p>
<pre><code class="language-cpp">typedef typename tree_iterator&lt;...parameter...&gt; iterator;
typedef const iterator const_iterator;
</code></pre>
<p>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.<br />
:xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819302</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Mon, 07 Dec 2009 21:49:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit const_cast on Mon, 07 Dec 2009 22:09:58 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typedef typename tree_iterator&lt;...parameter...&gt; iterator;
typedef const iterator const_iterator;
</code></pre>
<p>das macht nicht das, was du erwartest...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819314</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 07 Dec 2009 22:09:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit const_cast on Tue, 08 Dec 2009 06:46:31 GMT]]></title><description><![CDATA[<p>Ach Mist, stimmt. Ich Trottel... :xmas2:<br />
Dieser Iterator würde ja einem konstanten Zeiger gleichkommen, nicht meine Absicht.<br />
Ich werden das alles noch mal überdenken, vielen Dank.<br />
:xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819380</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 08 Dec 2009 06:46:31 GMT</pubDate></item></channel></rss>