<?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[Klassentemplate spezialisierungsproblem]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe ein problem mit einem klassentemplate und der spezialisierung eines funktionstemplates darin.</p>
<p>Hier mal der Fall:</p>
<pre><code class="language-cpp">//Klassentemplate
template&lt; class POSITIONTYPE, class POSITIONDATATYPE, class DATATYPE &gt;
class PTG
{
//[...]
protected:
    void Compute(const int cpu = 0);
//[...]
};

//Standard implementierung
template&lt; class POSITIONTYPE, class POSITIONDATATYPE, class DATATYPE &gt;
void PTG&lt;POSITIONTYPE,POSITIONDATATYPE,DATATYPE&gt;::Compute(const int cpu)
{	
//[...]
}

//Spezialisierung
template&lt; &gt;
void PTG&lt; std::vector &lt; vector3f &gt;, vector3f, double &gt;::Compute(const int cpu)
{
//[...]
}
</code></pre>
<p>Kompilieren tut es bis zum Build selber, dann erhalte ich einen Link error 2005. Die Funktion PTG&lt; std::vector &lt; vector3f &gt;, vector3f, double &gt;Compute() sei mehrmals definiert (also bereits in cptg.obj definiert). Nun, nehme ich die Spezialisierung heraus geht alles wunderbar, also scheint meine implementation irgendwie falsch zu sein. Steh ich aufm schlauch oder woran liegt das? Habe ich was falsch gemacht oder vergessen?</p>
<p>Vielen Dank bereits</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273577/klassentemplate-spezialisierungsproblem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 02:22:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273577.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Sep 2010 12:31:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassentemplate spezialisierungsproblem on Thu, 09 Sep 2010 12:31:35 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe ein problem mit einem klassentemplate und der spezialisierung eines funktionstemplates darin.</p>
<p>Hier mal der Fall:</p>
<pre><code class="language-cpp">//Klassentemplate
template&lt; class POSITIONTYPE, class POSITIONDATATYPE, class DATATYPE &gt;
class PTG
{
//[...]
protected:
    void Compute(const int cpu = 0);
//[...]
};

//Standard implementierung
template&lt; class POSITIONTYPE, class POSITIONDATATYPE, class DATATYPE &gt;
void PTG&lt;POSITIONTYPE,POSITIONDATATYPE,DATATYPE&gt;::Compute(const int cpu)
{	
//[...]
}

//Spezialisierung
template&lt; &gt;
void PTG&lt; std::vector &lt; vector3f &gt;, vector3f, double &gt;::Compute(const int cpu)
{
//[...]
}
</code></pre>
<p>Kompilieren tut es bis zum Build selber, dann erhalte ich einen Link error 2005. Die Funktion PTG&lt; std::vector &lt; vector3f &gt;, vector3f, double &gt;Compute() sei mehrmals definiert (also bereits in cptg.obj definiert). Nun, nehme ich die Spezialisierung heraus geht alles wunderbar, also scheint meine implementation irgendwie falsch zu sein. Steh ich aufm schlauch oder woran liegt das? Habe ich was falsch gemacht oder vergessen?</p>
<p>Vielen Dank bereits</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950228</guid><dc:creator><![CDATA[Katachi]]></dc:creator><pubDate>Thu, 09 Sep 2010 12:31:35 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate spezialisierungsproblem on Thu, 09 Sep 2010 12:54:25 GMT]]></title><description><![CDATA[<p>Du spezialisierst da eine Funktion, und nicht die Klasse. So bekommst Du einmal <code>Compute</code> durch das Template, und einmal durch die &quot;Spezialisierung&quot;. Beide haben aber die gleiche Signatur. Ergo: doppelte Definition. -&gt; geht so nicht.<br />
Mach ggf. eine Template-Funktion aus <code>Compute</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950245</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 09 Sep 2010 12:54:25 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate spezialisierungsproblem on Thu, 09 Sep 2010 13:18:06 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Du spezialisierst da eine Funktion, und nicht die Klasse.</p>
</blockquote>
<p>Ich will ja auch gar nicht die Klasse spezialisieren, ich spezialisiere die memberfunktion der Klasse was nichts anderes als ein Funktionstemplate sein dürfte. Oder was meinst du?</p>
<blockquote>
<p>So bekommst Du einmal <code>Compute</code> durch das Template, und einmal durch die &quot;Spezialisierung&quot;.<br />
Beide haben aber die gleiche Signatur. Ergo: doppelte Definition. -&gt; geht so nicht. Mach ggf. eine Template-Funktion aus <code>Compute</code> .</p>
</blockquote>
<p>Du sagst also dass eine Memberfunktion einer Templateklasse nicht direkt spezialisiert werden kann? Oder bedarf es eine templateparameters in der Signatur damit dies möglich ist?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950260</guid><dc:creator><![CDATA[Katachi]]></dc:creator><pubDate>Thu, 09 Sep 2010 13:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate spezialisierungsproblem on Thu, 09 Sep 2010 13:36:33 GMT]]></title><description><![CDATA[<p>Eigentlich sollte das funktionieren. Hast du die spezialisierte Funktion möglicherweise wirklich mehrmals definiert, weil du sie vielleicht (aus Gewohnheit von unspezialisierten Templates) in einen Header geschrieben hast? Dann wäre sie nämlich in mehreren Übersetzungseinheiten vorhanden, was den Fehler verursachen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950269</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 09 Sep 2010 13:36:33 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate spezialisierungsproblem on Thu, 09 Sep 2010 13:41:34 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Eigentlich sollte das funktionieren. Hast du die spezialisierte Funktion möglicherweise wirklich mehrmals definiert, weil du sie vielleicht (aus Gewohnheit von unspezialisierten Templates) in einen Header geschrieben hast? Dann wäre sie nämlich in mehreren Übersetzungseinheiten vorhanden, was den Fehler verursachen könnte.</p>
</blockquote>
<p>*auf die stirn klatsch* Ja natürlich! Vielen Dank, daran hatte ich tatsächlich überhaupt nicht gedacht. Ich erinnere mich jetzt auch dass ich genau den gleichen Fehler schonmal vor ein paar Wochen gemacht hatte. Man, und nichts daraus gelernt. <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="🙂"
    /> Danke jetzt geht alles wunderbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950273</guid><dc:creator><![CDATA[Katachi]]></dc:creator><pubDate>Thu, 09 Sep 2010 13:41:34 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate spezialisierungsproblem on Thu, 09 Sep 2010 14:23:34 GMT]]></title><description><![CDATA[<p>Hmm, ok, doch noch ein Problem. Also die spezialisierung in die implementationsdatei gepackt und die linker errors sind weg, aber leider sieht der compiler nun die spezialisierung nicht mehr. <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>
<p>Wenn ich ein entsprechendes Objekt der Klasse erzeuge scheint es dass er versucht die templateklasse heranzuziehen bei Compute memberaufruf anstatt der spezialisierung (und ich erhalte natürlich kompilierungsfehler deswegen weil die funktion für einen std::vector z.b. keinen sinn macht. Logisch, deswegen ja die spezialisierung nich). Hast du eine Idee wo der Fehler liegen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950308</guid><dc:creator><![CDATA[Katachi]]></dc:creator><pubDate>Thu, 09 Sep 2010 14:23:34 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate spezialisierungsproblem on Thu, 09 Sep 2010 14:29:28 GMT]]></title><description><![CDATA[<p>Hast du die Spezialisierung im Header deklariert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950314</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 09 Sep 2010 14:29:28 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate spezialisierungsproblem on Thu, 09 Sep 2010 14:34:46 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Hast du die Spezialisierung im Header deklariert?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> Ich muss weg...Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950319</guid><dc:creator><![CDATA[Katachi]]></dc:creator><pubDate>Thu, 09 Sep 2010 14:34:46 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate spezialisierungsproblem on Thu, 09 Sep 2010 15:46:24 GMT]]></title><description><![CDATA[<p>Eine Spezialisierung eines Funktionstemplates ist eine Funktion und darf gemäß ODR demzufolge innerhalb eines Programmes nur einmal definiert werden, es sei denn, es handelt sich um eine inline-Funktion. In diesem Zusammenhang ist zu bedenken, das auch eine implizite Instantiierung einer Templatespezialisierung einer Definition gleichsteht. Deshalb muss die Spezialisierung, die gesondert definiert wird in jeder Übersetzungseinheit, in der sie (auf eine Weise, die eine Instantiierung zur Folge hätte) verwendet wird, deklariert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950361</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 09 Sep 2010 15:46:24 GMT</pubDate></item></channel></rss>