<?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[Templatespezialisierung: Unterscheidung pointer und non-pointer type]]></title><description><![CDATA[<p>Hi,<br />
ich versuche gerade eine Klasse <code>Foo</code> zusammen zu basteln, die folgendes möglich macht:</p>
<pre><code>Foo&lt;int, -1&gt; a;
Foo&lt;void*, nullptr&gt; b;
</code></pre>
<p>Die Klasse braucht einen Typ und einen ungültigen Wert für diesen Typ.</p>
<p>Mein Versuch:</p>
<pre><code>template&lt;typename Type, Type invalid&gt;
struct Foo
{
	Type value = invalid;
};

template&lt;typename Type, Type* invalid&gt;
struct Foo&lt;Type*, invalid&gt;
{
	Type value = invalid;
	int i;
};

int main()
{
	Foo&lt;int, -1&gt; a;
	a.value = 5;
	Foo&lt;void*, nullptr&gt; b;
	b.i = 5;
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> main.cpp:19:4: error: no member named 'i' in 'Foo&lt;void *, nullptr&gt;'</p>
<p>Anscheinend wird die Spezialisierunug nicht gematcht. Wie würde es richtig aussehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339754/templatespezialisierung-unterscheidung-pointer-und-non-pointer-type</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 21:39:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339754.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Sep 2016 14:16:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templatespezialisierung: Unterscheidung pointer und non-pointer type on Mon, 26 Sep 2016 14:16:50 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich versuche gerade eine Klasse <code>Foo</code> zusammen zu basteln, die folgendes möglich macht:</p>
<pre><code>Foo&lt;int, -1&gt; a;
Foo&lt;void*, nullptr&gt; b;
</code></pre>
<p>Die Klasse braucht einen Typ und einen ungültigen Wert für diesen Typ.</p>
<p>Mein Versuch:</p>
<pre><code>template&lt;typename Type, Type invalid&gt;
struct Foo
{
	Type value = invalid;
};

template&lt;typename Type, Type* invalid&gt;
struct Foo&lt;Type*, invalid&gt;
{
	Type value = invalid;
	int i;
};

int main()
{
	Foo&lt;int, -1&gt; a;
	a.value = 5;
	Foo&lt;void*, nullptr&gt; b;
	b.i = 5;
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> main.cpp:19:4: error: no member named 'i' in 'Foo&lt;void *, nullptr&gt;'</p>
<p>Anscheinend wird die Spezialisierunug nicht gematcht. Wie würde es richtig aussehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509760</guid><dc:creator><![CDATA[Biolunar]]></dc:creator><pubDate>Mon, 26 Sep 2016 14:16:50 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung: Unterscheidung pointer und non-pointer type on Mon, 26 Sep 2016 14:58:32 GMT]]></title><description><![CDATA[<pre><code>template&lt;typename Type, Type *invalid&gt;
struct Foo&lt;Type*, invalid&gt;
{
    Type *value = invalid;
    int i;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2509763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509763</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 26 Sep 2016 14:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung: Unterscheidung pointer und non-pointer type on Mon, 26 Sep 2016 15:18:36 GMT]]></title><description><![CDATA[<p>Zeile 10:</p>
<pre><code>Type* value = invalid;
</code></pre>
<p>Anschließend compiliert und läuft es (Visual Studio 12)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509764</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 26 Sep 2016 15:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung: Unterscheidung pointer und non-pointer type on Mon, 26 Sep 2016 15:26:32 GMT]]></title><description><![CDATA[<p>Selber Fehler. Aber du hast recht, in der Spezialisierung müsste es <code>Type*</code> sein.</p>
<p>Nachtrag: clang++ 3.8.1 gibt mir den Fehler, g++ 6.2.1 akzeptiert den Code. clang Bug?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509765</guid><dc:creator><![CDATA[Biolunar]]></dc:creator><pubDate>Mon, 26 Sep 2016 15:26:32 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung: Unterscheidung pointer und non-pointer type on Mon, 26 Sep 2016 17:30:48 GMT]]></title><description><![CDATA[<p>Biolunar schrieb:</p>
<blockquote>
<p>Selber Fehler. Aber du hast recht, in der Spezialisierung müsste es <code>Type*</code> sein.</p>
<p>Nachtrag: clang++ 3.8.1 gibt mir den Fehler, g++ 6.2.1 akzeptiert den Code. clang Bug?</p>
</blockquote>
<p>Nach meinem Verständnis wüsste ich nicht weshalb er auch im <code>void*</code> -Fall nicht das erste Template instanzieren dürfte:</p>
<pre><code>template&lt;Type = void*, void* invalid = nullptr&gt;
struct Foo
{
    void* value = nullptr;
};
</code></pre>
<p>Sowas ähnliches hatte ich auch schon öfter und habe da bisher immer mit <code>std::enable_if&lt;std::is_pointer&lt;Type&gt;&gt;</code> gearbeitet.</p>
<p>Gruss,<br />
Finnegan</p>
<p>P.S.: Wenn man wissen möchte wie man Pointer grundsätzlich unterscheidet, lohnt es sich vielleicht mal eine Implementierung von <code>std::is_pointer</code> anzusehen. So auf Anhieb wüsse ich nicht wie ich da rangehen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509781</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Mon, 26 Sep 2016 17:30:48 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung: Unterscheidung pointer und non-pointer type on Mon, 26 Sep 2016 17:55:36 GMT]]></title><description><![CDATA[<p>Finnegan schrieb:</p>
<blockquote>
<p>Nach meinem Verständnis wüsste ich nicht weshalb er auch im <code>void*</code> -Fall nicht das erste Template instanzieren dürfte […]</p>
</blockquote>
<p>Siehe 1) auf <a href="http://en.cppreference.com/w/cpp/language/partial_specialization#Partial_ordering" rel="nofollow">http://en.cppreference.com/w/cpp/language/partial_specialization#Partial_ordering</a></p>
<p>Habe mein Problem nun anders gelöst (ohne Spezialisierung). Trotzdem merkwürdig, dass clang den Code nicht mag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509787</guid><dc:creator><![CDATA[Biolunar]]></dc:creator><pubDate>Mon, 26 Sep 2016 17:55:36 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung: Unterscheidung pointer und non-pointer type on Tue, 27 Sep 2016 10:19:25 GMT]]></title><description><![CDATA[<p>Das Problem hat etwas mit Templateargumentdeduktion zu tun. Wenn wir das Ganze etwas umschreiben:</p>
<pre><code class="language-cpp">template &lt;typename T, T x&gt; struct S {};
template &lt;typename T, T x&gt;
char foo(S&lt;T, x&gt;);

static_assert( sizeof(foo(S&lt;void*,nullptr&gt;{}))==1, &quot;&quot;);
</code></pre>
<p>hat clang weiterhin die gleichen Schwierigkeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509848</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 27 Sep 2016 10:19:25 GMT</pubDate></item></channel></rss>