<?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[Memberfunktionstemplate in einem spezialisierten Klassentemplate]]></title><description><![CDATA[<p>Guten morgen,</p>
<p>ich habe mich gerade verknotet. Soll vorkommen, wenn man zuviele Templates hat <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>
<p>Gegeben sei folgendes Klassentemplate</p>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
class Foo
{
public:
    // ctor, dtor weggelassen

    template&lt;typename T, typename U&gt;
    int bar(const T&amp; value, const B&amp; meta, const U&amp;);

};
</code></pre>
<p>Angenommen, für meinen Anwendungsfall stehen A und B fest</p>
<pre><code class="language-cpp">typedef Foo&lt;MyA, MyB&gt; MyFoo;
</code></pre>
<p>wie implementiere ich jetzt für das gegebene A und B das generische Template von bar()?</p>
<pre><code class="language-cpp">template&lt;typename T, typename U&gt;
int MyFoo::bar&lt;T, U&gt;(const T&amp; value, const MyB&amp; meta, const U&amp;)
{
    return doFancyStuff();
}
</code></pre>
<p>bzw eine totale Spezialisierung von MyFoo::bar ?</p>
<pre><code class="language-cpp">template&lt;&gt;
int MyFoo::bar&lt;string, int&gt;(const string&amp; value, const MyB&amp; meta, const int&amp;)
{
    return doSpecialStuff();
}
</code></pre>
<p>Gcc 4.5.0 erzählt mir zu allgemeinen Funktionsdefinition:</p>
<pre><code>error: template-id ‘bar&lt;T, U&gt;’ in declaration of primary template
error: new declaration ‘int Foo&lt;MyA, MyB&gt;::bar(const T&amp;, const MyB&amp;, const U&amp;)’
error: ambiguates old declaration ‘int Foo&lt;A, B&gt;::bar(const T&amp;, const B&amp;, const U&amp;) [with T = T, U = U, A = MyA, B = MyB]’
</code></pre>
<p>und zur Spezialisierung:</p>
<pre><code>error: template-id ‘bar&lt;string, int&gt;’ for ‘int Foo&lt;MyA, MyB&gt;::bar(const string&amp;, const MyB&amp;, const int&amp;)’ does not match any template declaration
note: saw 1 ‘template&lt;&gt;’, need 2 for specializing a member function template
</code></pre>
<p>Ich hab zwar schon oft Klassen spezialisiert, ich hab auch schon oft Funktionen spezialisiert, aber noch nie template-Memberfunktionen in Klassen, die selbst templates sind.</p>
<p>Helft mir bitte auf die Sprünge <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>
<p>Gruß,<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/278688/memberfunktionstemplate-in-einem-spezialisierten-klassentemplate</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 03:18:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/278688.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 Dec 2010 04:48:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Memberfunktionstemplate in einem spezialisierten Klassentemplate on Sat, 11 Dec 2010 04:48:21 GMT]]></title><description><![CDATA[<p>Guten morgen,</p>
<p>ich habe mich gerade verknotet. Soll vorkommen, wenn man zuviele Templates hat <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>
<p>Gegeben sei folgendes Klassentemplate</p>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
class Foo
{
public:
    // ctor, dtor weggelassen

    template&lt;typename T, typename U&gt;
    int bar(const T&amp; value, const B&amp; meta, const U&amp;);

};
</code></pre>
<p>Angenommen, für meinen Anwendungsfall stehen A und B fest</p>
<pre><code class="language-cpp">typedef Foo&lt;MyA, MyB&gt; MyFoo;
</code></pre>
<p>wie implementiere ich jetzt für das gegebene A und B das generische Template von bar()?</p>
<pre><code class="language-cpp">template&lt;typename T, typename U&gt;
int MyFoo::bar&lt;T, U&gt;(const T&amp; value, const MyB&amp; meta, const U&amp;)
{
    return doFancyStuff();
}
</code></pre>
<p>bzw eine totale Spezialisierung von MyFoo::bar ?</p>
<pre><code class="language-cpp">template&lt;&gt;
int MyFoo::bar&lt;string, int&gt;(const string&amp; value, const MyB&amp; meta, const int&amp;)
{
    return doSpecialStuff();
}
</code></pre>
<p>Gcc 4.5.0 erzählt mir zu allgemeinen Funktionsdefinition:</p>
<pre><code>error: template-id ‘bar&lt;T, U&gt;’ in declaration of primary template
error: new declaration ‘int Foo&lt;MyA, MyB&gt;::bar(const T&amp;, const MyB&amp;, const U&amp;)’
error: ambiguates old declaration ‘int Foo&lt;A, B&gt;::bar(const T&amp;, const B&amp;, const U&amp;) [with T = T, U = U, A = MyA, B = MyB]’
</code></pre>
<p>und zur Spezialisierung:</p>
<pre><code>error: template-id ‘bar&lt;string, int&gt;’ for ‘int Foo&lt;MyA, MyB&gt;::bar(const string&amp;, const MyB&amp;, const int&amp;)’ does not match any template declaration
note: saw 1 ‘template&lt;&gt;’, need 2 for specializing a member function template
</code></pre>
<p>Ich hab zwar schon oft Klassen spezialisiert, ich hab auch schon oft Funktionen spezialisiert, aber noch nie template-Memberfunktionen in Klassen, die selbst templates sind.</p>
<p>Helft mir bitte auf die Sprünge <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>
<p>Gruß,<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1992858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1992858</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 11 Dec 2010 04:48:21 GMT</pubDate></item><item><title><![CDATA[Reply to Memberfunktionstemplate in einem spezialisierten Klassentemplate on Sat, 11 Dec 2010 05:15:08 GMT]]></title><description><![CDATA[<p>Wer liest, was der Compiler sagt, ist klar im Vorteil <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>
<p>So kompilierts:</p>
<p>h-Datei</p>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
class Foo
{
public:
    // ctor, dtor weggelassen

    template&lt;typename T, typename U&gt;
    int bar(const T&amp; value, const B&amp; meta, const U&amp;);

}; 

typedef Foo&lt;MyA, MyB&gt; MyFoo; 

template&lt;&gt;
template&lt;typename T, typename U&gt;
int MyFoo::bar(const T&amp; value, const MyB&amp; meta, const U&amp;)
{
    return doFancyStuff();
} 

template&lt;&gt;
template&lt;&gt;
int MyFoo::Bar&lt;string, int&gt;(const string&amp; value, const MyB&amp; meta, const int&amp;);
</code></pre>
<p>cpp-Datei</p>
<pre><code class="language-cpp">template&lt;&gt;
template&lt;&gt;
int MyFoo::Bar&lt;string, int&gt;(const string&amp; value, const MyB&amp; meta, const int&amp;)
{
    return doSpecialStuff();
}
</code></pre>
<p>So schön das kompiliert, beim Linken gehts in die Hose: &quot;undefined symbol: _ZN4XSPL15FooIN3SCS5MyAENS1_15MyBEE13barIiNS1_7AS_LONGEEEiRKT_RKS3_RKT0_&quot;</p>
<p>Diese Fehlermeldung hilft mir natürlich extrem weiter.</p>
<p>Was mach ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1992861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1992861</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 11 Dec 2010 05:15:08 GMT</pubDate></item><item><title><![CDATA[Reply to Memberfunktionstemplate in einem spezialisierten Klassentemplate on Sat, 11 Dec 2010 05:43:57 GMT]]></title><description><![CDATA[<p>Ach, lernen im Selbsgespräch ist schon schön.</p>
<p>So gehts:</p>
<p>.h</p>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
class Foo
{
public:
    // ctor, dtor weggelassen

    template&lt;typename T, typename U&gt;
    int bar(const T&amp; value, const B&amp; meta, const U&amp;);

};

template&lt;&gt;
class Foo&lt;MyA, MyB&gt; {

    template&lt;typename T, typename U&gt;
    int bar(const T&amp; value, const MyB&amp; meta, const U&amp;)
    {
        return doFancyStuff();
    }
};

template&lt;&gt;
int Foo&lt;MyA, MyB&gt;::Bar&lt;string, int&gt;(const string&amp; value, const MyB&amp; meta, const int&amp;); 	

typedef Foo&lt;MyA, MyB&gt; MyFoo;
</code></pre>
<p>.cpp</p>
<pre><code class="language-cpp">template&lt;&gt;
int Foo&lt;MyA, MyB&gt;::Bar&lt;string, int&gt;(const string&amp; value, const MyB&amp; meta, const int&amp;)
{
    doSpecialStuff();
}
</code></pre>
<p>Klassentemplate spezialisieren statt typedeffen. Den Typedef gibts jetzt nur noch zur Bneutzer-Convenience.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1992862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1992862</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 11 Dec 2010 05:43:57 GMT</pubDate></item></channel></rss>