<?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, Konvertierung?]]></title><description><![CDATA[<p>Hi!<br />
Ich benutze C++14.<br />
Problem:</p>
<pre><code>#include &lt;memory&gt;

template &lt;typename Op, typename T&gt;
struct base { };

template &lt;typename Mode, typename T&gt;
struct derived { };

// int-Spezialisierung
template &lt;typename T&gt;
struct derived&lt;int, T&gt; : public base&lt;derived&lt;int, T&gt;, T&gt; { }; // CRTP pattern

// geht nicht
template &lt;typename D, typename T&gt;
void fun(std::unique_ptr&lt;base&lt;D, T&gt;&gt;) { }

// geht
template &lt;typename D, typename T&gt;
void fun(base&lt;D, T&gt;*) { }

int main() {
    auto d = std::make_unique&lt;derived&lt;int, double&gt;&gt;();
    fun(std::move(d)); // Fehler
    fun(d.get()); // ok
}
</code></pre>
<p>Siehe <a href="http://ideone.com/UsAsXm" rel="nofollow">http://ideone.com/UsAsXm</a></p>
<p>Mit normalen Zeigern kann ich derived in base konvertieren, unique_ptr schafft das in diesem Fall nicht. Kann ich dem Typsystem irgendwie auf die Sprünge helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333116/unique_ptr-konvertierung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 06:35:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333116.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Jun 2015 13:30:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to unique_ptr, Konvertierung? on Fri, 12 Jun 2015 13:30:49 GMT]]></title><description><![CDATA[<p>Hi!<br />
Ich benutze C++14.<br />
Problem:</p>
<pre><code>#include &lt;memory&gt;

template &lt;typename Op, typename T&gt;
struct base { };

template &lt;typename Mode, typename T&gt;
struct derived { };

// int-Spezialisierung
template &lt;typename T&gt;
struct derived&lt;int, T&gt; : public base&lt;derived&lt;int, T&gt;, T&gt; { }; // CRTP pattern

// geht nicht
template &lt;typename D, typename T&gt;
void fun(std::unique_ptr&lt;base&lt;D, T&gt;&gt;) { }

// geht
template &lt;typename D, typename T&gt;
void fun(base&lt;D, T&gt;*) { }

int main() {
    auto d = std::make_unique&lt;derived&lt;int, double&gt;&gt;();
    fun(std::move(d)); // Fehler
    fun(d.get()); // ok
}
</code></pre>
<p>Siehe <a href="http://ideone.com/UsAsXm" rel="nofollow">http://ideone.com/UsAsXm</a></p>
<p>Mit normalen Zeigern kann ich derived in base konvertieren, unique_ptr schafft das in diesem Fall nicht. Kann ich dem Typsystem irgendwie auf die Sprünge helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456556</guid><dc:creator><![CDATA[Unique_ptr]]></dc:creator><pubDate>Fri, 12 Jun 2015 13:30:49 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr, Konvertierung? on Fri, 12 Jun 2015 17:19:45 GMT]]></title><description><![CDATA[<p>Woher soll denn der Compiler wissen wie er std::unique_ptr&lt;derived&lt;int, double&gt;&gt; zu std::unique_ptr&lt;base&lt;derived&lt;int, double&gt;, double&gt; konvertieren soll? Da fehlt der Konstruktor in der std::unique_ptr Klasse für.<br />
Und ob das mit der Typededuction hier</p>
<pre><code>template &lt;typename D, typename T&gt;
void fun(std::unique_ptr&lt;base&lt;D, T&gt;&gt;) { }
</code></pre>
<p>So funktioniert, wie du dir das vorstellst glaub ich auch nicht, vielleicht kann das noch jemand anderes besser erklären <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":O"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456591</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Fri, 12 Jun 2015 17:19:45 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr, Konvertierung? on Fri, 12 Jun 2015 17:35:29 GMT]]></title><description><![CDATA[<p>Mr.Long schrieb:</p>
<blockquote>
<p>Woher soll denn der Compiler wissen wie er std::unique_ptr&lt;derived&lt;int, double&gt;&gt; zu std::unique_ptr&lt;base&lt;derived&lt;int, double&gt;, double&gt; konvertieren soll? Da fehlt der Konstruktor in der std::unique_ptr Klasse für.</p>
</blockquote>
<p>Unsinn, da fehlt gar kein Konstruktor.<br />
<a href="http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr" rel="nofollow">http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr</a><br />
(6)</p>
<p>Mr.Long schrieb:</p>
<blockquote>
<p>Und ob das mit der Typededuction hier</p>
<pre><code>template &lt;typename D, typename T&gt;
void fun(std::unique_ptr&lt;base&lt;D, T&gt;&gt;) { }
</code></pre>
<p>So funktioniert, wie du dir das vorstellst glaub ich auch nicht, vielleicht kann das noch jemand anderes besser erklären <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":O"
      alt="😮"
    /></p>
</blockquote>
<p>Das wird das eigentliche Problem sein schätze ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456594</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 12 Jun 2015 17:35:29 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr, Konvertierung? on Fri, 12 Jun 2015 17:38:02 GMT]]></title><description><![CDATA[<p>Mr.Long schrieb:</p>
<blockquote>
<p>Da fehlt der Konstruktor in der std::unique_ptr Klasse für.</p>
</blockquote>
<p>Der existiert.</p>
<p>Mr.Long schrieb:</p>
<blockquote>
<p>Und ob das mit der Typededuction hier</p>
<pre><code>template &lt;typename D, typename T&gt;
void fun(std::unique_ptr&lt;base&lt;D, T&gt;&gt;) { }
</code></pre>
<p>So funktioniert, wie du dir das vorstellst glaub ich auch nicht, vielleicht kann das noch jemand anderes besser erklären <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":O"
      alt="😮"
    /></p>
</blockquote>
<p>Das ist ja auch das Problem. Eine solch allgemeine Deduktionsregel kann gar nicht existieren, da der Compiler potentiell jede beliebige Kombination von Templateargumenten testen müsste, um herauszufinden, ob eine davon zufällig über eine passable Konvertierung verfügt.</p>
<p>Hier muss also vom Programmierer nachgeholfen werden. z.B.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
std::unique_ptr&lt;base&lt;derived&lt;int, T&gt;, T&gt;&gt; to_base(std::unique_ptr&lt;derived&lt;int, T&gt;&gt; p)
{
    return std::move(p);
}
...
    fun(to_base(std::move(d)));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2456595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456595</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 12 Jun 2015 17:38:02 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr, Konvertierung? on Sat, 13 Jun 2015 09:25:41 GMT]]></title><description><![CDATA[<p>Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456631</guid><dc:creator><![CDATA[Unique_ptr]]></dc:creator><pubDate>Sat, 13 Jun 2015 09:25:41 GMT</pubDate></item></channel></rss>