<?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[unique_ptr und vector resize]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe den unique_ptr von c++0x ausprobiert und einen <code>std::vector&lt;std::unique_ptr&lt;MyObject&gt;&gt;</code> angelegt mit dem ich bis jetzt gut klar gekommen bin. Nun möchte ich die resize Methode darauf aufrufen und bekomme folgenden Fehler:</p>
<pre><code>...
/usr/include/c++/4.4/bits/unique_ptr.h:214: error: deleted function ‘std::unique_ptr&lt;_Tp, _Tp_Deleter&gt;::unique_ptr(const std::unique_ptr&lt;_Tp, _Tp_Deleter&gt;&amp;) [with _Tp = MyObject, _Tp_Deleter = std::default_delete&lt;MyObject&gt;]’
/usr/include/c++/4.4/bits/stl_construct.h:74: error: used here
</code></pre>
<p>Weiß jemand Rat?</p>
<p>Lg, Jaz</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272363/unique_ptr-und-vector-resize</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 22:11:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272363.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Aug 2010 12:39:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to unique_ptr und vector resize on Mon, 16 Aug 2010 12:39:06 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe den unique_ptr von c++0x ausprobiert und einen <code>std::vector&lt;std::unique_ptr&lt;MyObject&gt;&gt;</code> angelegt mit dem ich bis jetzt gut klar gekommen bin. Nun möchte ich die resize Methode darauf aufrufen und bekomme folgenden Fehler:</p>
<pre><code>...
/usr/include/c++/4.4/bits/unique_ptr.h:214: error: deleted function ‘std::unique_ptr&lt;_Tp, _Tp_Deleter&gt;::unique_ptr(const std::unique_ptr&lt;_Tp, _Tp_Deleter&gt;&amp;) [with _Tp = MyObject, _Tp_Deleter = std::default_delete&lt;MyObject&gt;]’
/usr/include/c++/4.4/bits/stl_construct.h:74: error: used here
</code></pre>
<p>Weiß jemand Rat?</p>
<p>Lg, Jaz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940575</guid><dc:creator><![CDATA[JazQ]]></dc:creator><pubDate>Mon, 16 Aug 2010 12:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr und vector resize on Mon, 16 Aug 2010 12:53:33 GMT]]></title><description><![CDATA[<p>ein google nach &quot;C++0x deleted function&quot; liefert <a href="http://www2.research.att.com/~bs/C++0xFAQ.html#default" rel="nofollow">http://www2.research.att.com/~bs/C++0xFAQ.html#default</a><br />
Schlussfolgerung: unique_ptr ist noncopyable. vector verlangt aber kopierbare elemente. =&gt; vector&lt;unique_ptr&lt;&gt;&gt; läuft nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940586</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 16 Aug 2010 12:53:33 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr und vector resize on Mon, 16 Aug 2010 13:28:55 GMT]]></title><description><![CDATA[<p>Die Fehlermeldung hört sich tatsächlich so an, aber wieso gibt es dann zig Tutorials (z.B. <a href="http://www.devx.com/cplus/10MinuteSolution/39071/1954" rel="nofollow">http://www.devx.com/cplus/10MinuteSolution/39071/1954</a>), wo das Zusammenspiel von unique_ptr und vector erklärt wird? Außerdem muss der vector ja auch seine Daten auch intern umkopieren, wenn er wächst, d.h. es dürfte auch nicht kompilieren wenn ich nicht explizit resize verwenden würde. Dann funktioniert es aber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940599</guid><dc:creator><![CDATA[Jazq]]></dc:creator><pubDate>Mon, 16 Aug 2010 13:28:55 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr und vector resize on Mon, 16 Aug 2010 13:34:31 GMT]]></title><description><![CDATA[<p>Jazq schrieb:</p>
<blockquote>
<p>Die Fehlermeldung hört sich tatsächlich so an, aber wieso gibt es dann zig Tutorials (z.B. <a href="http://www.devx.com/cplus/10MinuteSolution/39071/1954" rel="nofollow">http://www.devx.com/cplus/10MinuteSolution/39071/1954</a>), wo das Zusammenspiel von unique_ptr und vector erklärt wird? Außerdem muss der vector ja auch seine Daten auch intern umkopieren, wenn er wächst, d.h. es dürfte auch nicht kompilieren wenn ich nicht explizit resize verwenden würde. Dann funktioniert es aber.</p>
</blockquote>
<p>Vielleicht musst du eine neuere Compilerversion benutzen? Du scheinst einen gcc 4.4 zu benutzen, aktuell ist aber 4.5. Die c++-0x Implementierung ist bestimmt noch nicht fehlerfrei.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940600</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 16 Aug 2010 13:34:31 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr und vector resize on Mon, 16 Aug 2010 13:39:49 GMT]]></title><description><![CDATA[<p>Jazq schrieb:</p>
<blockquote>
<p>Die Fehlermeldung hört sich tatsächlich so an, aber wieso gibt es dann zig Tutorials (z.B. <a href="http://www.devx.com/cplus/10MinuteSolution/39071/1954" rel="nofollow">http://www.devx.com/cplus/10MinuteSolution/39071/1954</a>), wo das Zusammenspiel von unique_ptr und vector erklärt wird?</p>
</blockquote>
<p>Das erste was ich unter deinem Link zum vector + unique_ptr gefunden habe ist folgender Satz:</p>
<blockquote>
<p>If a container of unique_ptr objects moves elements internally instead of copying them, your code will work without problems. If, however, a container or an algorithm uses copy semantics for its value_type you will get a compilation error.</p>
</blockquote>
<p>Ich bin kein C++0x Fachmann, aber ich vermute mal dass die neuen std::vector'en für &quot;normale&quot; Vergrößerungen (z.B. bei push_back) die move-semantik benutzen, die unique_ptr wohl unterstützen wird, während resize() offenbar was anderes macht - evtl. werden die neuen Elemente mit dem optionalen Werte-Parameter von resize() copy-konstruiert? Wo genau der Copy-Ctor aufgerufen wird siehst du vermutlich an der bezeichneten Stelle - stl_construct.h, Zeile 74</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940603</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 16 Aug 2010 13:39:49 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr und vector resize on Mon, 16 Aug 2010 15:19:39 GMT]]></title><description><![CDATA[<p>Jazq schrieb:</p>
<blockquote>
<p>aber wieso gibt es dann zig Tutorials (z.B. <a href="http://www.devx.com/cplus/10MinuteSolution/39071/1954" rel="nofollow">http://www.devx.com/cplus/10MinuteSolution/39071/1954</a>), wo das Zusammenspiel von unique_ptr und vector erklärt wird?</p>
</blockquote>
<p>In C++0x (noch nicht fertige kommende Revision des C++ Standards) wird std::vector auch Typen wie unique_ptr verarbeiten können. Das heißt aber nicht, dass jede Operation auch unterstützt wird. Da unique_ptr nicht kopierbar ist, kannst Du resize auch nicht benutzen; denn resize will ggf einen default-konstruierten oder übergebenen unique_ptr mehrfach in den Vektor kopieren.</p>
<p>Füllen kannst Du diesen Vektor beispielsweise mit reserve und push_back oder emplace_back:</p>
<pre><code class="language-cpp">vector&lt;unique_ptr&lt;int&gt; &gt; vec;
vec.reserve(100);
for (int i=0; i&lt;100; ++i) {
  vec.push_back( unique_ptr&lt;int&gt;(0) );
}
</code></pre>
<p>(ungetestet).</p>
<p>Jazq schrieb:</p>
<blockquote>
<p>Außerdem muss der vector ja auch seine Daten auch intern umkopieren, wenn er wächst, d.h. es dürfte auch nicht kompilieren wenn ich nicht explizit resize verwenden würde. Dann funktioniert es aber.</p>
</blockquote>
<p>In C++0x wird der Vektor nicht alles kopieren müssen. Ein unique_ptr-Objekt kann von einem Ort zu einem anderen &quot;umziehen&quot;. Und das wird im Vektor auch so gemacht. Manuell geht das so:</p>
<pre><code class="language-cpp">unique_ptr&lt;int&gt; p (new int);
*p = 23;
unique_ptr&lt;int&gt; q = std::move(p);
cout &lt;&lt; *q &lt;&lt; endl;
if (!p) {
  cout &lt;&lt; &quot;p ist jetzt ein Nullzeiger&quot; &lt;&lt; endl;
}
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940649</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 16 Aug 2010 15:19:39 GMT</pubDate></item></channel></rss>