<?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[vector&amp;lt;const...&amp;gt;]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich will Übergabeparameter für eine Methode consten. Das sieht so aus:</p>
<pre><code class="language-cpp">void Visualizer::writeTriangles(vector&lt;const Triangle* const&gt;&amp; vTriangles) const
{
  for(vector&lt;const Triangle* const&gt;::iterator it=vTriangles.begin();it!=vTriangles.end();++it)
  {
    bla..;
  }
}
</code></pre>
<p>Damit will ich sagen, daß sowohl die Pointer im Vektor als auch die Inhalte, auf die sie zeigen, konstant sind. Dann läßt sich aber nicht mehr über den<br />
Vector iterieren, denn:</p>
<p>/usr/include/c++/4.4/ext/new_allocator.h: In instantiation of ‘__gnu_cxx::new_allocator&lt;const Triangle* const&gt;’:<br />
/usr/include/c++/4.4/bits/allocator.h:87: instantiated from ‘std::allocator&lt;const Triangle* const&gt;’<br />
/usr/include/c++/4.4/bits/stl_vector.h:71: instantiated from ‘std::_Vector_base&lt;const Triangle* const, std::allocator&lt;const Triangle* const&gt; &gt;’<br />
/usr/include/c++/4.4/bits/stl_vector.h:171: instantiated from ‘std::vector&lt;const Triangle* const, std::allocator&lt;const Triangle* const&gt; &gt;’<br />
Visualizer.cpp:126: instantiated from here<br />
/usr/include/c++/4.4/ext/new_allocator.h:79: error: ‘const _Tp* __gnu_cxx::new_allocator&lt;_Tp&gt;::address(const _Tp&amp;) const [with _Tp = const Triangle* const]’ cannot be overloaded<br />
/usr/include/c++/4.4/ext/new_allocator.h:76: error: with ‘_Tp* __gnu_cxx::new_allocator&lt;_Tp&gt;::address(_Tp&amp;) const [with _Tp = const Triangle* const]’</p>
<p>Wo liegt nun der Denkfehler?</p>
<p>Danke, lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272439/vector-lt-const-gt</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 22:17:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272439.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Aug 2010 16:49:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Tue, 17 Aug 2010 16:49:39 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich will Übergabeparameter für eine Methode consten. Das sieht so aus:</p>
<pre><code class="language-cpp">void Visualizer::writeTriangles(vector&lt;const Triangle* const&gt;&amp; vTriangles) const
{
  for(vector&lt;const Triangle* const&gt;::iterator it=vTriangles.begin();it!=vTriangles.end();++it)
  {
    bla..;
  }
}
</code></pre>
<p>Damit will ich sagen, daß sowohl die Pointer im Vektor als auch die Inhalte, auf die sie zeigen, konstant sind. Dann läßt sich aber nicht mehr über den<br />
Vector iterieren, denn:</p>
<p>/usr/include/c++/4.4/ext/new_allocator.h: In instantiation of ‘__gnu_cxx::new_allocator&lt;const Triangle* const&gt;’:<br />
/usr/include/c++/4.4/bits/allocator.h:87: instantiated from ‘std::allocator&lt;const Triangle* const&gt;’<br />
/usr/include/c++/4.4/bits/stl_vector.h:71: instantiated from ‘std::_Vector_base&lt;const Triangle* const, std::allocator&lt;const Triangle* const&gt; &gt;’<br />
/usr/include/c++/4.4/bits/stl_vector.h:171: instantiated from ‘std::vector&lt;const Triangle* const, std::allocator&lt;const Triangle* const&gt; &gt;’<br />
Visualizer.cpp:126: instantiated from here<br />
/usr/include/c++/4.4/ext/new_allocator.h:79: error: ‘const _Tp* __gnu_cxx::new_allocator&lt;_Tp&gt;::address(const _Tp&amp;) const [with _Tp = const Triangle* const]’ cannot be overloaded<br />
/usr/include/c++/4.4/ext/new_allocator.h:76: error: with ‘_Tp* __gnu_cxx::new_allocator&lt;_Tp&gt;::address(_Tp&amp;) const [with _Tp = const Triangle* const]’</p>
<p>Wo liegt nun der Denkfehler?</p>
<p>Danke, lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941128</guid><dc:creator><![CDATA[constX]]></dc:creator><pubDate>Tue, 17 Aug 2010 16:49:39 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Tue, 17 Aug 2010 17:42:53 GMT]]></title><description><![CDATA[<p>Alle Standardcontainer erwarten, dass der Werttyp Assignable ist. T const *const ist das nicht.</p>
<p>Was du tun kannst, ist</p>
<pre><code class="language-cpp">vector&lt;Triangle const *&gt; const &amp;vTriangles
</code></pre>
<p>übergeben und</p>
<pre><code class="language-cpp">vector&lt;Triangle const *&gt;::const_iterator
</code></pre>
<p>benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941154</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 17 Aug 2010 17:42:53 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Tue, 17 Aug 2010 17:53:48 GMT]]></title><description><![CDATA[<p>&gt; Wo liegt nun der Denkfehler?</p>
<p>Entweder glaubst Du, dass man <code>vector&lt;const X&gt;</code> für irgend einen Typen X verwenden kann (dem ist nicht so), oder Du hast Dich in der Position des zweiten <code>const</code> s geirrt.</p>
<p>Wolltest Du vielleicht</p>
<pre><code class="language-cpp">vector&lt;const Triangle*&gt; const&amp; vTriangles
</code></pre>
<p>statt</p>
<pre><code class="language-cpp">vector&lt;const Triangle* const&gt;&amp; vTriangles
</code></pre>
<p>verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941161</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 17 Aug 2010 17:53:48 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Tue, 17 Aug 2010 18:54:14 GMT]]></title><description><![CDATA[<p>davon ab macht selbst &quot;vector&lt;const Triangle*&gt;&quot; als Parameter mit fast 100% Wahrscheinlichkeit nicht das, was du willst. Ich vermute, dass du sowas machen möchtest:</p>
<pre><code class="language-cpp">vector&lt;Triangle*&gt; triangles;
//...
//wie auch immer dein Code aussieht...nur als Beispiel
triangles[0]-&gt;point1=neuerPunkt();
//...
visualizer.writeTriangles(triangles);
</code></pre>
<p>Das würde aber nicht klappen, da der vector &quot;Triangle*&quot; enthält und nicht &quot;const Triangle*&quot;. Der Parameter muss dann &quot;vector&lt;Triangle*&gt; const &amp;&quot; sein, damit das funktioniert.</p>
<p>Eine echte Lösung gibt es für dein Problem leider nicht. Das ist ein Mangel der Sprache. Weniger Probleme hast du mit &quot;vector&lt;Triangle&gt; const &amp;&quot;, dann sind auch die Elemente unveränderlich und alles funktioniert blendend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941189</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 17 Aug 2010 18:54:14 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Wed, 18 Aug 2010 07:37:14 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Weniger Probleme hast du mit &quot;vector&lt;Triangle&gt; const &amp;&quot;, dann sind auch die Elemente unveränderlich und alles funktioniert blendend.</p>
</blockquote>
<p>Die Elemente ja - das worauf sie zeigen, nämlich die eigentlich interessanten Triangle-Objekte nicht...</p>
<p>/edith meint ich soll genauer lesen, dann schreiben...</p>
<p>otze schrieb:</p>
<blockquote>
<p>deshalb sind dort die Elemente auch keine Zeiger <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1941191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941191</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 18 Aug 2010 07:37:14 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Tue, 17 Aug 2010 19:19:55 GMT]]></title><description><![CDATA[<p>deshalb sind dort die Elemente auch keine Zeiger <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941199</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 17 Aug 2010 19:19:55 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Wed, 18 Aug 2010 07:14:16 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Eine echte Lösung gibt es für dein Problem leider nicht.</p>
</blockquote>
<p>Vielleicht ist ja ein boost pointer container besser geeignet. Sonst kann man noch einen &quot;transform iterator&quot; benutzen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;boost/iterator/transform_iterator.hpp&gt;

template&lt;class Iter&gt;
void show(Iter beg, Iter end)
{
	while (beg!=end) {
		std::cout &lt;&lt; ' ' &lt;&lt; *beg;
		++beg;
	}
	std::cout &lt;&lt; '\n';
}

template&lt;class Result&gt;
struct deref
{
	typedef Result&amp; result_type;
	template&lt;class PointerLike&gt;
	Result&amp; operator()(PointerLike const&amp; p) const { return *p; }
};

template&lt;class DerefAs, class Iter&gt;
boost::transform_iterator&lt;deref&lt;DerefAs&gt;,Iter&gt;
make_deref_iter(Iter it)
{
	typedef deref&lt;DerefAs&gt; fun;
	return boost::transform_iterator&lt;fun,Iter&gt;(it,fun());
}

int main()
{
	int i = 23;
	int j = 42;
	std::vector&lt;int*&gt; intptrs;
	intptrs.push_back(&amp;i);
	intptrs.push_back(&amp;j);
	// show bekommt Iteratoren, die die Zeiger in intptrs
	// dereferenzieren und eine const-Referenz liefern
	// show kann damit i und j nicht ohne weiteres ändern.
	show(make_deref_iter&lt;const int&gt;(intptrs.begin()),
	     make_deref_iter&lt;const int&gt;(intptrs.end()  ) );
}
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941208</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 18 Aug 2010 07:14:16 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Tue, 17 Aug 2010 20:08:36 GMT]]></title><description><![CDATA[<p>Ich finds Schade, dass das im Standard bei Zeigern versäumt wurde. für mich fühlt es sich natürlich an, dass wenn &quot;x ist const&quot; gilt auch &quot;x-&gt;y ist const&quot; gilt( oder Eingeschränkt: &quot;ist z const und enthält z einen nicht mutable Member z.x dann ist auch z.x-&gt;y const&quot; Aber ein ähnliches Problem gibt es ja auch bei Iteratoren, weswegen wir einen const_iterator brauchen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941218</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 17 Aug 2010 20:08:36 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Tue, 17 Aug 2010 21:46:03 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Alle Standardcontainer erwarten, dass der Werttyp Assignable ist. T const *const ist das nicht.</p>
<p>Was du tun kannst, ist</p>
<pre><code class="language-cpp">vector&lt;Triangle const *&gt; const &amp;vTriangles
</code></pre>
<p>übergeben und</p>
<pre><code class="language-cpp">vector&lt;Triangle const *&gt;::const_iterator
</code></pre>
<p>benutzen.</p>
</blockquote>
<p>Danke allen für die Antworten. Das obige ist die Lösung. Ich kannte bloß den ::const_iterator noch nicht. Wieder was gelernt.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941239</guid><dc:creator><![CDATA[constX]]></dc:creator><pubDate>Tue, 17 Aug 2010 21:46:03 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Tue, 17 Aug 2010 23:47:06 GMT]]></title><description><![CDATA[<p>Man kann sowas auch &quot;elegant&quot; mit Iterator-Ranges und einem Template lösen:</p>
<pre><code class="language-cpp">class Visualizer
{
public:
    template &lt;class Iterator&gt;
    void WriteTriangles(Iterator begin, Iterator end) const
    {
        for(; begin != end; ++begin)
            Blah(*begin);
    }

private:
    void Blah(Triangles const* triangle) const; // kein template und kann daher in der .cpp implementiert werden
};
</code></pre>
<p>So einer WriteTriangles() Funktion könnte man dann sowohl Iteratoren auf einen vector&lt;Triangles const*&gt; als auch auf einen vector&lt;Triangles*&gt; übergeben. Oder rohe Arrays oder ganz andere Container verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941253</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 17 Aug 2010 23:47:06 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;const...&amp;gt; on Wed, 18 Aug 2010 06:58:05 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Man kann sowas auch &quot;elegant&quot; mit Iterator-Ranges und einem Template lösen:</p>
<pre><code class="language-cpp">template &lt;class Iterator&gt;
void WriteTriangles(Iterator begin, Iterator end) const
{
    for(; begin != end; ++begin)
        Blah(*begin);
}

void Blah(Triangles const* triangle) const; // kein template und kann daher in der .cpp implementiert werden
</code></pre>
</blockquote>
<p>Ja. Das ist keine schlechte Idee. So kann man auch &quot;Template-Bloat&quot; reduzieren, in dem man das, was sich für verschiedene Spezialisierungen nicht unterscheidet in ein nicht-Template (wie Blah) auslagert.</p>
<p>...wobei ich aber auch daran zweifle, wie sinnig es ist, einen container&lt;T&gt; mit T = const Triangle* zu verwenden. Ich hoffe, dass der nicht so zustande gekommen ist:</p>
<pre><code class="language-cpp">vector&lt;Triangle*&gt; ptrvec;
  ...
  vector&lt;Triangle const*&gt; const&amp; cref = reinterpret_cast&lt;vector&lt;Triangle const*&gt;&amp;&gt;(ptrvec);  
  dings(cref.begin(),cref.end());
</code></pre>
<p>(Nicht nachmachen! Es ruft undefiniertes Verhalten hervor nach §3.10/15!)</p>
<p>Ein vector&lt;Triangle*&gt; mag durch aus sinnvoll sein. Und wenn dann jemand an einer unveränderlichen Triangle-Sequenz interessiert ist, sind Iteratoren, die ich zB mit make_deref_iter erzeugt habe (siehe oben), doch sehr praktisch. Ich versuche jedenfalls Iteratoren, die bei der Dereferenzierung Zeiger liefern, zu vermeiden.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941287</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 18 Aug 2010 06:58:05 GMT</pubDate></item></channel></rss>