<?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[Template in Klasse ohne Klassentemplate]]></title><description><![CDATA[<p>Hi everyone</p>
<p>Kann ich eine Template-Memberfunktion erstellen, ohne dabei ein Klassentemplate draus zu machen?</p>
<p>Ich möchte eine Memberfunktion meiner Klasse explizit mit einem Typnamen angegeben aufrufen lassen, etwa so:</p>
<pre><code class="language-cpp">class CEwbOutput
{
// ...
public:
template &lt;typename T&gt;
void otp_LPEx2(std::vector&lt;CEwbMeter *&gt;::const_iterator, std::vector&lt;CEwbMeter *&gt;::const_iterator) const;
// ...
</code></pre>
<p>Die Klasse selbst ist also keine Template-Klasse, hat aber eine Template Memberfunktion. Der Compiler lässt mir das so durchgehen, der Linker allerdings reklamiert beim folgenden Aufruf:</p>
<pre><code class="language-cpp">stdOtp.otp_LPEx2&lt;CEMeter&gt;(ewbArray.begin(), remove_if(ewbArray.begin(), ewbArray.end(), otPred));
</code></pre>
<p>Und zwar mit der Meldung:</p>
<pre><code>: undefined reference to `void CEwbOutput::otp_LPEx2&lt;CEMeter&gt;(__gnu_cxx::__normal_iterator&lt;CEwbMeter* const*, std::vector&lt;CEwbMeter*, 
std::allocator&lt;CEwbMeter*&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;CEwbMeter* const*, std::vector&lt;CEwbMeter*, std::allocator&lt;CEwbMeter*&gt; &gt; &gt;) 
const'
</code></pre>
<p>Gehen also Template-Members ohne Template-Klassen gar nicht oder habe ich da sonst was verbockt <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>Thx schon im Voraus und greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186998/template-in-klasse-ohne-klassentemplate</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 15:58:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186998.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Jul 2007 13:41:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template in Klasse ohne Klassentemplate on Sat, 14 Jul 2007 13:41:06 GMT]]></title><description><![CDATA[<p>Hi everyone</p>
<p>Kann ich eine Template-Memberfunktion erstellen, ohne dabei ein Klassentemplate draus zu machen?</p>
<p>Ich möchte eine Memberfunktion meiner Klasse explizit mit einem Typnamen angegeben aufrufen lassen, etwa so:</p>
<pre><code class="language-cpp">class CEwbOutput
{
// ...
public:
template &lt;typename T&gt;
void otp_LPEx2(std::vector&lt;CEwbMeter *&gt;::const_iterator, std::vector&lt;CEwbMeter *&gt;::const_iterator) const;
// ...
</code></pre>
<p>Die Klasse selbst ist also keine Template-Klasse, hat aber eine Template Memberfunktion. Der Compiler lässt mir das so durchgehen, der Linker allerdings reklamiert beim folgenden Aufruf:</p>
<pre><code class="language-cpp">stdOtp.otp_LPEx2&lt;CEMeter&gt;(ewbArray.begin(), remove_if(ewbArray.begin(), ewbArray.end(), otPred));
</code></pre>
<p>Und zwar mit der Meldung:</p>
<pre><code>: undefined reference to `void CEwbOutput::otp_LPEx2&lt;CEMeter&gt;(__gnu_cxx::__normal_iterator&lt;CEwbMeter* const*, std::vector&lt;CEwbMeter*, 
std::allocator&lt;CEwbMeter*&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;CEwbMeter* const*, std::vector&lt;CEwbMeter*, std::allocator&lt;CEwbMeter*&gt; &gt; &gt;) 
const'
</code></pre>
<p>Gehen also Template-Members ohne Template-Klassen gar nicht oder habe ich da sonst was verbockt <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>Thx schon im Voraus und greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1325320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1325320</guid><dc:creator><![CDATA[KessiMC]]></dc:creator><pubDate>Sat, 14 Jul 2007 13:41:06 GMT</pubDate></item><item><title><![CDATA[Reply to Template in Klasse ohne Klassentemplate on Sat, 14 Jul 2007 14:28:54 GMT]]></title><description><![CDATA[<p>Das geht schon. Aber so wie's aussieht kann der Linker deine Implementierung nicht finden. Bist Du Dir der Tatsache bewusst, dass die Implementierung einer Template-Funktion *ebenfalls* in die Header-Datei muss? In einer cpp-Datei findet sie der Linker nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1325349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1325349</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 14 Jul 2007 14:28:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template in Klasse ohne Klassentemplate on Mon, 16 Jul 2007 10:38:13 GMT]]></title><description><![CDATA[<p>Außerdem verwendet die Methode gar nicht den Template-Parameter 'T'.<br />
Es müßte also so deklariert werden:</p>
<pre><code class="language-cpp">class CEwbOutput
{
// ...
public:
template &lt;typename T&gt;
void otp_LPEx2(std::vector&lt;T*&gt;::const_iterator, std::vector&lt;T*&gt;::const_iterator) const;
// ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1326429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326429</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 16 Jul 2007 10:38:13 GMT</pubDate></item><item><title><![CDATA[Reply to Template in Klasse ohne Klassentemplate on Mon, 16 Jul 2007 10:42:24 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Es müßte also so deklariert werden:</p>
<pre><code class="language-cpp">class CEwbOutput
{
// ...
public:
template &lt;typename T&gt;
void otp_LPEx2(std::vector&lt;T*&gt;::const_iterator, std::vector&lt;T*&gt;::const_iterator) const;
// ...
</code></pre>
</blockquote>
<p>Da fehlen zwei typenames.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326432</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 16 Jul 2007 10:42:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template in Klasse ohne Klassentemplate on Mon, 16 Jul 2007 11:12:14 GMT]]></title><description><![CDATA[<p>Zusammenfassend:<br />
Aus</p>
<p>KessiMC schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class CEwbOutput
{
// ...
public:
template &lt;typename T&gt;
void otp_LPEx2(std::vector&lt;CEwbMeter *&gt;::const_iterator, std::vector&lt;CEwbMeter *&gt;::const_iterator) const;
// ...
</code></pre>
</blockquote>
<p>müsste werden:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void otp_LPEx2(typename std::vector&lt;T *&gt;::const_iterator, typename std::vector&lt;T *&gt;::const_iterator) const {
  // Implementierung
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1326454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326454</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Mon, 16 Jul 2007 11:12:14 GMT</pubDate></item><item><title><![CDATA[Reply to Template in Klasse ohne Klassentemplate on Wed, 18 Jul 2007 15:32:47 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Das geht schon. Aber so wie's aussieht kann der Linker deine Implementierung nicht finden. Bist Du Dir der Tatsache bewusst, dass die Implementierung einer Template-Funktion *ebenfalls* in die Header-Datei muss? In einer cpp-Datei findet sie der Linker nicht.</p>
</blockquote>
<p>Ah, ah, ah, stiiimmt... Daran hat's gelegen. Der Parameter T wird übrigens zum casten innerhalb der Methode verwendet.</p>
<p>Thx und greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327892</guid><dc:creator><![CDATA[KessiMC]]></dc:creator><pubDate>Wed, 18 Jul 2007 15:32:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template in Klasse ohne Klassentemplate on Wed, 18 Jul 2007 19:38:08 GMT]]></title><description><![CDATA[<p>Nur so nebenbei: man muss Template Parameter nicht verwenden, ein</p>
<pre><code class="language-cpp">template &lt;class T, class U&gt; void foo() {}
</code></pre>
<p>ist schon vollkommen OK.<br />
Visual C++ 6 ist halt wieder mal zu doof um damit umzugehen, aber grundsätzlich ist nix daran auszusetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328048</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 18 Jul 2007 19:38:08 GMT</pubDate></item><item><title><![CDATA[Reply to Template in Klasse ohne Klassentemplate on Thu, 19 Jul 2007 10:38:04 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nur so nebenbei: man muss Template Parameter nicht verwenden, ein</p>
<pre><code class="language-cpp">template &lt;class T, class U&gt; void foo() {}
</code></pre>
<p>ist schon vollkommen OK.<br />
Visual C++ 6 ist halt wieder mal zu doof um damit umzugehen, aber grundsätzlich ist nix daran auszusetzen.</p>
</blockquote>
<p>In diesem Fall müssen beim Aufruf von foo die Typen, die für T und U eingesetzt werden sollen, explizit angegeben werden - und hier wird's beim VC 6.0 eng. explicit template argument specification unterstützt der VC 6.0 nur für freie Funktionen. Die Synatx obj.memberTemplate&lt;x, y, z&gt;() hingegen, versteht dieser ältere Compiler nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328377</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Thu, 19 Jul 2007 10:38:04 GMT</pubDate></item></channel></rss>