<?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[Explizite Templatespezialisierung]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich dreh gerade ein wenig am Rad, folgendes compiliert das Visual Studio Express 2005:</p>
<pre><code class="language-cpp">// Code steht in KEINER Templateklasse
template &lt;typename T&gt; 
T GetValue() const;

template&lt;&gt;
int GetValue&lt;int&gt;() const
			{ 
				if(GetType() != INT) 
					throw std::runtime_error(&quot;Wrong datatype specified!&quot;); 

				return(*static_cast&lt; const int* &gt;(m_pData)); 
			}
</code></pre>
<p>Soweit, so gut. Nur der MinGW kommt damit gar nicht klar.</p>
<blockquote>
<p>**<br />
invalid explicit specialization before '&gt;' token<br />
**</p>
</blockquote>
<p>Ich hab schon viel gegoogelt und weiß grob warum nicht. Es geht wohl darum, dass mindestens ein Templateparameter angegeben werden muss, quasi sowas:</p>
<pre><code class="language-cpp">template&lt;typename T1, typename T2 = void&gt; // bringt aber auch nichts
</code></pre>
<p>Allerdings weiß aber auch nicht wie die richtige Syntax lautet.</p>
<p>Wer lesen will, ich glaube das hier ist's:</p>
<blockquote>
<p>**<br />
an explicit specialization declaration for a member of a class tem-<br />
plate or a member template that appears in namespace scope, the member<br />
template and some of its enclosing class templates may remain unspe-<br />
cialized, except that the declaration shall not explicitly specialize<br />
a class member template if its enclosing class templates are not<br />
explicitly specialized as well. In such explicit specialization dec-<br />
laration, the keyword template followed by a template-parameter-list<br />
shall be provided instead of the template&lt;&gt; preceding the explicit<br />
specialization declaration of the member. The types of the template-<br />
parameters in the template-parameter-list shall be the same as those<br />
specified in the primary template definition.**</p>
</blockquote>
<p>Na ja, ich muss gestehen, dass ich da jetzt mehr oder minder blind rumprobiere...<br />
z.B. soetwas</p>
<pre><code class="language-cpp">template&lt;typename T =int &gt; 
T GetValue&lt;T&gt;() const
	            { 
				if(GetType() != INT) 
					throw std::runtime_error(&quot;Wrong datatype specified!&quot;); 

				return(*static_cast&lt; const T* &gt;(m_pData)); 
			} 
// Gibt Fehler: partial specialization `GetValue&lt;T&gt;' of function template
</code></pre>
<p>Wäre toll wenn mir da jemand hilft . <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/142912/explizite-templatespezialisierung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 02:02:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/142912.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Apr 2006 07:43:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Explizite Templatespezialisierung on Tue, 04 Apr 2006 07:43:33 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich dreh gerade ein wenig am Rad, folgendes compiliert das Visual Studio Express 2005:</p>
<pre><code class="language-cpp">// Code steht in KEINER Templateklasse
template &lt;typename T&gt; 
T GetValue() const;

template&lt;&gt;
int GetValue&lt;int&gt;() const
			{ 
				if(GetType() != INT) 
					throw std::runtime_error(&quot;Wrong datatype specified!&quot;); 

				return(*static_cast&lt; const int* &gt;(m_pData)); 
			}
</code></pre>
<p>Soweit, so gut. Nur der MinGW kommt damit gar nicht klar.</p>
<blockquote>
<p>**<br />
invalid explicit specialization before '&gt;' token<br />
**</p>
</blockquote>
<p>Ich hab schon viel gegoogelt und weiß grob warum nicht. Es geht wohl darum, dass mindestens ein Templateparameter angegeben werden muss, quasi sowas:</p>
<pre><code class="language-cpp">template&lt;typename T1, typename T2 = void&gt; // bringt aber auch nichts
</code></pre>
<p>Allerdings weiß aber auch nicht wie die richtige Syntax lautet.</p>
<p>Wer lesen will, ich glaube das hier ist's:</p>
<blockquote>
<p>**<br />
an explicit specialization declaration for a member of a class tem-<br />
plate or a member template that appears in namespace scope, the member<br />
template and some of its enclosing class templates may remain unspe-<br />
cialized, except that the declaration shall not explicitly specialize<br />
a class member template if its enclosing class templates are not<br />
explicitly specialized as well. In such explicit specialization dec-<br />
laration, the keyword template followed by a template-parameter-list<br />
shall be provided instead of the template&lt;&gt; preceding the explicit<br />
specialization declaration of the member. The types of the template-<br />
parameters in the template-parameter-list shall be the same as those<br />
specified in the primary template definition.**</p>
</blockquote>
<p>Na ja, ich muss gestehen, dass ich da jetzt mehr oder minder blind rumprobiere...<br />
z.B. soetwas</p>
<pre><code class="language-cpp">template&lt;typename T =int &gt; 
T GetValue&lt;T&gt;() const
	            { 
				if(GetType() != INT) 
					throw std::runtime_error(&quot;Wrong datatype specified!&quot;); 

				return(*static_cast&lt; const T* &gt;(m_pData)); 
			} 
// Gibt Fehler: partial specialization `GetValue&lt;T&gt;' of function template
</code></pre>
<p>Wäre toll wenn mir da jemand hilft . <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030046</guid><dc:creator><![CDATA[explizit]]></dc:creator><pubDate>Tue, 04 Apr 2006 07:43:33 GMT</pubDate></item><item><title><![CDATA[Reply to Explizite Templatespezialisierung on Tue, 04 Apr 2006 07:55:05 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Probiers mal hiermit:</p>
<pre><code class="language-cpp">// Code steht in KEINER Templateklasse 
 template &lt;typename T&gt; 
 T GetValue() const; 

 template&lt;typename T&gt; // Hier muss ein typ in den spitzen Klammern stehen
 T GetValue() const  // im prototyp gibst du ein T und keinen int zurueck
             { 
                 if(GetType() != INT) 
                     throw std::runtime_error(&quot;Wrong datatype specified!&quot;); 

                 return(*static_cast&lt; const int* &gt;(m_pData)); 
             }
</code></pre>
<p>mfg LastManStanding</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030060</guid><dc:creator><![CDATA[LastManStanding]]></dc:creator><pubDate>Tue, 04 Apr 2006 07:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to Explizite Templatespezialisierung on Tue, 04 Apr 2006 08:14:39 GMT]]></title><description><![CDATA[<p>MinGW meldet dann das, was leider abzusehen war:</p>
<blockquote>
<p><code>template&lt;class T&gt; T ClassA::GetValue() const' and</code>template&lt;class T&gt; T ClassA::GetValue() const'</p>
<p>cannot be overloaded</p>
</blockquote>
<p><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=":-/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030080</guid><dc:creator><![CDATA[explizit]]></dc:creator><pubDate>Tue, 04 Apr 2006 08:14:39 GMT</pubDate></item><item><title><![CDATA[Reply to Explizite Templatespezialisierung on Tue, 04 Apr 2006 08:28:45 GMT]]></title><description><![CDATA[<p>Funktionstemplates kannst du nicht explizit spezialisieren - aber du kannst sie überladen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
T getVal();

int getVal()
{...}
</code></pre>
<p>(btw, wozu brauchst du das überhaupt?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030093</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 04 Apr 2006 08:28:45 GMT</pubDate></item><item><title><![CDATA[Reply to Explizite Templatespezialisierung on Tue, 04 Apr 2006 08:35:53 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Funktionstemplates kannst du nicht explizit spezialisieren - aber du kannst sie überladen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
T getVal();

int getVal()
{...}
</code></pre>
<p>(btw, wozu brauchst du das überhaupt?)</p>
</blockquote>
<p>Siehe hier:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-141577.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-141577.html</a></p>
<p>Ich hatte mich entschlossen die Methode aus dem letzten Post zu verwenden, allerdings hab ich erst jetzt festgestellt, dass der MinGW damit nicht einverstanden ist... aber das ist halt die eleganteste Möglichkeit und ich würde sie gerne beibehalten.</p>
<p>Soweit ich weiß dürfen sich Methoden bei der Überladung nicht ausschließlich durch den Rückgabetyp unterscheiden, ich teste es mal eben...</p>
<p>es geht<br />
<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=":open_mouth:"
      alt="😮"
    /> <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=":open_mouth:"
      alt="😮"
    /> <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=":open_mouth:"
      alt="😮"
    /> unglaublich, das mag ich ja gar nicht glauben. Damit spiel ich erstmal rum <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/1030102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030102</guid><dc:creator><![CDATA[explizit]]></dc:creator><pubDate>Tue, 04 Apr 2006 08:35:53 GMT</pubDate></item><item><title><![CDATA[Reply to Explizite Templatespezialisierung on Tue, 04 Apr 2006 08:58:08 GMT]]></title><description><![CDATA[<p>Ich wusste, da war etwas. Wenn man das Spielchen so weitertreibt und jetzt für die anderen Datentypen überlädt, gibt es folgende Meldung:</p>
<blockquote>
<p>**<br />
<code>unsigned int ClassA::GetValue() const' and</code>int ClassA::GetValue() const'<br />
cannot be overloaded<br />
**</p>
</blockquote>
<p>Wäre super, wenn einer der Forum-Gurus mir da helfen könnte (und sei es nur durch die Aussage &quot;Mit dieser Template-Variante geht das beim MinGW schlichtweg nicht&quot;).<br />
Ich glaube, alleine komme ich da nicht mehr weiter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030126</guid><dc:creator><![CDATA[explizit]]></dc:creator><pubDate>Tue, 04 Apr 2006 08:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to Explizite Templatespezialisierung on Tue, 04 Apr 2006 09:35:14 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Funktionstemplates kannst du nicht explizit spezialisieren</p>
</blockquote>
<p>Das ist falsch. Funktionstemplates kann man nicht partiell spezialisieren (stattdessen kann man sie überladen). Explizite spezialisieren kann man sie hingegen schon.</p>
<p>Das:</p>
<pre><code class="language-cpp">// 1. Base Template
template &lt;class T&gt;
T getValue();

// 2.
template &lt;&gt;
int getValue&lt;int&gt;() {
return 0;
}
</code></pre>
<p>ist legales C++ und 2. eine explizite Spezialisierung des Base Templates.</p>
<p>Das hier:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T GetValue() const;
</code></pre>
<p>muss ja *innerhalb* einer Klassendefinition stehen. Andernfalls wäre die const-Deklaration ein Fehler.</p>
<p>Steht nun das hier:</p>
<pre><code class="language-cpp">template&lt;&gt;
int GetValue&lt;int&gt;() const
            {
                if(GetType() != INT)
                    throw std::runtime_error(&quot;Wrong datatype specified!&quot;);

                return(*static_cast&lt; const int* &gt;(m_pData));
            }
</code></pre>
<p>ebenfalls *innerhalb* der Klassendefinition, wäre der Fehler klar: Eine explizitze Spezialisierung ist nur innerhalb eines Namespace-Scopes zulässig. Nicht aber innerhalb eines Klassenscopes.<br />
Die korrekte Lösung:</p>
<pre><code class="language-cpp">class Foo {
public:
    template &lt;typename T&gt;
    T GetValue() const;
};

// Definition des Base-Templates
template &lt;class T&gt;
T Foo::GetValue() const {
    // ...
    return T();
}

// Definition einer expliziten Spezialisierung
template &lt;&gt;
int Foo::GetValue&lt;int&gt;() const {
    // ...
    return 42;
}
</code></pre>
<p>So sähe das für ein Member-Template aus.</p>
<p>Vielleicht ist Foo aber auch ein Template und GetValue nur eine normale Methode?</p>
<pre><code class="language-cpp">template &lt;class X&gt;
class Foo {
public:

    X GetValue() const;
};

// Definition des Base-Templates
template &lt;class X&gt;
X Foo&lt;X&gt;::GetValue() const {
    // ...
    return X();
}

// Definition einer expliziten Spezialisierung
template &lt;&gt;
int Foo&lt;int&gt;::GetValue() const {
    // ...
    return 42;
}
</code></pre>
<p>Sollte hingegen Foo ein Template sein und GetValue ein Member-Template, dann ist ist eine explizite Spezialisierung von GetValue nur bei gleichzeitiger Spezialisierung von Foo möglich:</p>
<pre><code class="language-cpp">template &lt;class X&gt;
class Foo {
public:
    template &lt;class T&gt;
    T GetValue() const;
};

// Definition des Base-Templates
template &lt;class X&gt;
template &lt;class T&gt;
T Foo&lt;X&gt;::GetValue() const {
    // ...
    return X();
}

// Definition einer expliziten Spezialisierung
template &lt;&gt;
template &lt;&gt;
int Foo&lt;int&gt;::GetValue&lt;int&gt;() const {
    // ...
    return 42;
}
</code></pre>
<p>All das ändert nichts an der Tatsache, dass eine Überladung meist sinnvoller als einer Spezialisierung ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030158</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 04 Apr 2006 09:35:14 GMT</pubDate></item><item><title><![CDATA[Reply to Explizite Templatespezialisierung on Tue, 04 Apr 2006 10:49:05 GMT]]></title><description><![CDATA[<p>Da wäre ich niemals drauf gekommen.<br />
Ich glaube, an dieser Stelle ist es mal an der Zeit, zurückzublicken und einfach nur &quot;Danke&quot; zu sagen <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="😉"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Einige Leute in diesem Forum haben ein Wissen über C++, das ist unglaublich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030220</guid><dc:creator><![CDATA[explizit]]></dc:creator><pubDate>Tue, 04 Apr 2006 10:49:05 GMT</pubDate></item><item><title><![CDATA[Reply to Explizite Templatespezialisierung on Tue, 04 Apr 2006 17:55:18 GMT]]></title><description><![CDATA[<p>@explizit:<br />
Mal ne andere Frage.<br />
Wie sieht denn der Code aus der irgendwann mal links von GetValue stehen soll?<br />
Da musst du doch auch schon im Vorfeld wissen welchen Typ dir GetValue zurückliefert.</p>
<p>MfG Spacelord</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030498</guid><dc:creator><![CDATA[Spacelord]]></dc:creator><pubDate>Tue, 04 Apr 2006 17:55:18 GMT</pubDate></item></channel></rss>