<?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[enable_if]]></title><description><![CDATA[<p>Ich bin gerade ziemlich verwirrt. Warum kompiliert das nicht und wie repariert man es? <a href="http://ideone.com/eDRy5G" rel="nofollow">Ideone</a>.</p>
<pre><code>struct Test{
	template&lt;class T&gt;
	Test(T &amp;t) : Test&lt;T, typename std::is_const&lt;T&gt;::type&gt;(t){}

	template&lt;class T, std::true_type&gt; //error
	Test(T &amp;t){ &quot;t ist const!&quot;; }

	template&lt;class T, std::false_type&gt;
	Test(T &amp;t){ &quot;t ist nicht const!&quot;; }
};
	//Zeile 5:
	//error: ‘struct std::integral_constant&lt;bool, true&gt;’ is not a valid type for a template non-type parameter
	//bzw.
	//'std::true_type' : illegal type for non-type template parameter
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/325121/enable_if</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 00:03:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325121.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Apr 2014 11:37:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to enable_if on Tue, 15 Apr 2014 11:37:52 GMT]]></title><description><![CDATA[<p>Ich bin gerade ziemlich verwirrt. Warum kompiliert das nicht und wie repariert man es? <a href="http://ideone.com/eDRy5G" rel="nofollow">Ideone</a>.</p>
<pre><code>struct Test{
	template&lt;class T&gt;
	Test(T &amp;t) : Test&lt;T, typename std::is_const&lt;T&gt;::type&gt;(t){}

	template&lt;class T, std::true_type&gt; //error
	Test(T &amp;t){ &quot;t ist const!&quot;; }

	template&lt;class T, std::false_type&gt;
	Test(T &amp;t){ &quot;t ist nicht const!&quot;; }
};
	//Zeile 5:
	//error: ‘struct std::integral_constant&lt;bool, true&gt;’ is not a valid type for a template non-type parameter
	//bzw.
	//'std::true_type' : illegal type for non-type template parameter
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2394699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394699</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 15 Apr 2014 11:37:52 GMT</pubDate></item><item><title><![CDATA[Reply to enable_if on Tue, 15 Apr 2014 11:48:51 GMT]]></title><description><![CDATA[<p>template-parameter müssen entweder templates, typen oder integrale werte sein. klassen-instanzen von nicht-integralen typen sind nicht erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394701</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Tue, 15 Apr 2014 11:48:51 GMT</pubDate></item><item><title><![CDATA[Reply to enable_if on Tue, 15 Apr 2014 11:57:39 GMT]]></title><description><![CDATA[<p>Irgendwie sehe ich die Klasseninstanz nicht. std::true_type ist meiner Meinung nach ein Typ, aber der Rest der Welt scheint zu meinen, dass std::true_type ein Objekt ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394703</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 15 Apr 2014 11:57:39 GMT</pubDate></item><item><title><![CDATA[Reply to enable_if on Tue, 15 Apr 2014 12:03:38 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Irgendwie sehe ich die Klasseninstanz nicht. std::true_type ist meiner Meinung nach ein Typ, aber der Rest der Welt scheint zu meinen, dass std::true_type ein Objekt ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>uups, verlesen. ja, du hast recht. true_type ist ein typ:<br />
<a href="http://www.cplusplus.com/reference/type_traits/true_type/" rel="nofollow">http://www.cplusplus.com/reference/type_traits/true_type/</a><br />
<a href="http://en.cppreference.com/w/cpp/types/integral_constant" rel="nofollow">http://en.cppreference.com/w/cpp/types/integral_constant</a></p>
<p>und indem du template&lt;typ&gt; schreibst, forderst du eine instanz des types als template-argument an, was (mit true_type) nicht erlaubt ist.</p>
<p>nachtrag: ich glaube, man kann sowieso die template-argumente bei konstruktor-templates nicht explizit angeben. oder hat sich das mit c++11 geändert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394704</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Tue, 15 Apr 2014 12:03:38 GMT</pubDate></item><item><title><![CDATA[Reply to enable_if on Tue, 15 Apr 2014 12:14:51 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Irgendwie sehe ich die Klasseninstanz nicht. std::true_type ist meiner Meinung nach ein Typ</p>
</blockquote>
<p><em>Typen</em> sind aber <strong>nicht</strong> erlaubt (ausser integrale, vielleicht wurde das in C++11 etwas gelockert). Wenn du Typen in der Template-Parameterliste auflistest, erwartet das Template bei der Instanziierung ein <em>Objekt</em>.</p>
<p><em>Typparameter</em> hingegen (mit <code>typename</code> deklarierte Templateparameter) erwarten einen <em>Typ</em> als Argument.</p>
<p>Dein Code enthält keine Templatespezialisierung, da du den Basisfall nicht deklarierst (Funktionstemplate mit 2 Parametern). Würde ich aber gar nicht erst versuchen, schon gar nicht bei Konstruktoren. Nimm stattdessen Überladung; das ist ein übliches Idiom für Tag-Dispatching.</p>
<pre><code>template &lt;typename T&gt;
Test(T&amp; t, std::true_type) {...}

template&lt;typename T&gt;
Test(T&amp; t, std::false_type) {...}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2394705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394705</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 15 Apr 2014 12:14:51 GMT</pubDate></item><item><title><![CDATA[Reply to enable_if on Tue, 15 Apr 2014 12:15:09 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>In deinem Fall, nimm Überladung</p>
</blockquote>
<p>Danke, irgendwie bin ich da nicht drauf gekommen.</p>
<pre><code>struct Test{
	template&lt;class T&gt;
	Test(T &amp;t) : Test(t, std::is_const&lt;T&gt;::value){}

	template&lt;class T&gt;
	Test(T &amp;t, std::true_type){ &quot;t ist const!&quot;; }

	template&lt;class T&gt;
	Test(T &amp;t, std::false_type){ &quot;t ist nicht const!&quot;; }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2394706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394706</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 15 Apr 2014 12:15:09 GMT</pubDate></item><item><title><![CDATA[Reply to enable_if on Tue, 15 Apr 2014 12:18:39 GMT]]></title><description><![CDATA[<p>Gibt es einen Grund dafür dass du hier nicht einfach ein mal T&amp; und einmal const T&amp; nimmst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394707</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 15 Apr 2014 12:18:39 GMT</pubDate></item><item><title><![CDATA[Reply to enable_if on Tue, 15 Apr 2014 12:52:07 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Gibt es einen Grund dafür dass du hier nicht einfach ein mal T&amp; und einmal const T&amp; nimmst?</p>
</blockquote>
<p>Der Grund ist, dass ich ein weiteres Template mit dem übergebenen Typ T instanziiere und dieses T dann const ist, was mir Sachen kaputt macht.<br />
Ich versuche Vererbung zu verstecken in diesem Stil: <a href="http://channel9.msdn.com/Events/GoingNative/2013/Inheritance-Is-The-Base-Class-of-Evil" rel="nofollow">Inheritance Is The Base Class of Evil</a>.<br />
Und wenn ich ein const-Objekt übergebe funktioniert es nicht weil T const ist.<br />
Hier ein <a href="http://ideone.com/aZUpO6" rel="nofollow">Beispiel</a>, dass das Problem zeigt. In der Fehlermeldung sieht man was er aus dem T gemacht hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394711</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 15 Apr 2014 12:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to enable_if on Tue, 15 Apr 2014 13:59:00 GMT]]></title><description><![CDATA[<p>Du meinst so? <a href="https://ideone.com/ksNs96" rel="nofollow">https://ideone.com/ksNs96</a><br />
make_unique gibt's btw nicht weil die das (ja, das ist ernst gemeint) &quot;übersehen&quot; haben. Wie auch immer, ab C++14 ist es da, und VS hat es z.B. auch schon implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394720</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 15 Apr 2014 13:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to enable_if on Tue, 15 Apr 2014 17:11:37 GMT]]></title><description><![CDATA[<p>Cool danke, funktioniert.<br />
Das mit dem unique_ptr wusste ich eigentlich. Irgendwie passt er nur nicht in mein Weltbild, dass VS bei neuen C++-Features dem gcc voraus sein könnte und da habe ich es verdrängt.<br />
Irgendwann sollte ich dir mal eine Riesenpackung Kekse spendieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394769</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 15 Apr 2014 17:11:37 GMT</pubDate></item></channel></rss>