<?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[Keine spezialisierten template-methoden in klassen template?]]></title><description><![CDATA[<p>Hallo Leuts,</p>
<p>Beim folgenden code tritt folgende Fehlermeldung auf:</p>
<pre><code>test2.cpp:80:12: Fehler: explizite Spezialisierung in Gültigkeitsbereich des Nicht-Namensbereiches »class compound_t&lt;sub_words_t&gt;«
test2.cpp:81:34: Fehler: Template-ID »call_sub_words&lt;0&gt;« in Deklaration des ersten Templates
</code></pre>
<p>Versteh ich das jetzt richtig, dass Spezialisierungen von Templatemethoden in Templateklassen nicht erlaubt sind? Oder wo liegt der Fehler? Und wie umgehe ich das Problem am elegantesten?</p>
<p>Danke,<br />
Martin</p>
<pre><code class="language-cpp">template &lt;typename ... sub_words_t&gt;
class compound_t
{
public:
  compound_t(sub_words_t ... sub_words)
    : sub_words(sub_words ...)
  {  }

  void operator()(vm_t &amp;vm)
  {
    call_sub_words&lt;sizeof...(sub_words_t)-1&gt;(vm);
  }

private:
  static vm_t *vm;

  template&lt;std::size_t n&gt;
  void call_sub_words(vm_t &amp;vm)
  {
    std::get&lt;n&gt;(sub_words)(vm);
    call_sub_words&lt;n-1&gt;(vm);
  }

  template&lt;&gt;
  void call_sub_words&lt;0&gt;(vm_t &amp;vm)
  {
    std::get&lt;0&gt;(sub_words)(vm);    
  }

  std::tuple&lt;sub_words_t ...&gt; sub_words;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/298243/keine-spezialisierten-template-methoden-in-klassen-template</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 20:48:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298243.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Jan 2012 12:13:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Keine spezialisierten template-methoden in klassen template? on Mon, 16 Jan 2012 12:13:47 GMT]]></title><description><![CDATA[<p>Hallo Leuts,</p>
<p>Beim folgenden code tritt folgende Fehlermeldung auf:</p>
<pre><code>test2.cpp:80:12: Fehler: explizite Spezialisierung in Gültigkeitsbereich des Nicht-Namensbereiches »class compound_t&lt;sub_words_t&gt;«
test2.cpp:81:34: Fehler: Template-ID »call_sub_words&lt;0&gt;« in Deklaration des ersten Templates
</code></pre>
<p>Versteh ich das jetzt richtig, dass Spezialisierungen von Templatemethoden in Templateklassen nicht erlaubt sind? Oder wo liegt der Fehler? Und wie umgehe ich das Problem am elegantesten?</p>
<p>Danke,<br />
Martin</p>
<pre><code class="language-cpp">template &lt;typename ... sub_words_t&gt;
class compound_t
{
public:
  compound_t(sub_words_t ... sub_words)
    : sub_words(sub_words ...)
  {  }

  void operator()(vm_t &amp;vm)
  {
    call_sub_words&lt;sizeof...(sub_words_t)-1&gt;(vm);
  }

private:
  static vm_t *vm;

  template&lt;std::size_t n&gt;
  void call_sub_words(vm_t &amp;vm)
  {
    std::get&lt;n&gt;(sub_words)(vm);
    call_sub_words&lt;n-1&gt;(vm);
  }

  template&lt;&gt;
  void call_sub_words&lt;0&gt;(vm_t &amp;vm)
  {
    std::get&lt;0&gt;(sub_words)(vm);    
  }

  std::tuple&lt;sub_words_t ...&gt; sub_words;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2168676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168676</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Mon, 16 Jan 2012 12:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to Keine spezialisierten template-methoden in klassen template? on Mon, 16 Jan 2012 12:16:51 GMT]]></title><description><![CDATA[<p>Sorry, das folgende hat im Beispiel nix verloren. Ist nur ein Überbleibsel einer Überlegung.</p>
<pre><code class="language-cpp">static vm_t *vm;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2168678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168678</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Mon, 16 Jan 2012 12:16:51 GMT</pubDate></item><item><title><![CDATA[Reply to Keine spezialisierten template-methoden in klassen template? on Mon, 16 Jan 2012 12:20:08 GMT]]></title><description><![CDATA[<p>Nein, du kannst member Funktionen nicht spezialisieren. Du kannst das aber umgehen, indem du in der template member Funktion ein template Objekt erstellst, das die eigentlich Aufgabe übernimmt.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
functor
{
   void func( arg op )
   {
   }
}

template&lt;&gt;
functor&lt;int&gt;
{
   void func( arg op )
   {
   }
}

template&lt;typename T&gt;
void someclass::func( arg op )
{
   functor&lt;T&gt; f;
   f.func( op )
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2168680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168680</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 16 Jan 2012 12:20:08 GMT</pubDate></item><item><title><![CDATA[Reply to Keine spezialisierten template-methoden in klassen template? on Tue, 17 Jan 2012 09:16:25 GMT]]></title><description><![CDATA[<p>Warum sollte ich den keine Membermethode spezialisieren dürfen? Folgendes funktioniert ohne Probleme:</p>
<pre><code class="language-cpp">template&lt; typename TT &gt;
class Test
{
public:
    template&lt; int xx &gt;
    void oper( int &amp;C )
    {

    }

    template&lt;&gt;
    void oper&lt;0&gt;( int &amp;C )
    {

    }
};

...

int var = 0;
Test&lt;int&gt; obj;
obj.oper&lt;0&gt;( var);
</code></pre>
<p>Partielle Spezialisierung ist nicht erlaubt. Oder hat sich was im neuen Standard geändert?</p>
<p>leftshift</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169037</guid><dc:creator><![CDATA[leftshift]]></dc:creator><pubDate>Tue, 17 Jan 2012 09:16:25 GMT</pubDate></item><item><title><![CDATA[Reply to Keine spezialisierten template-methoden in klassen template? on Tue, 17 Jan 2012 11:24:43 GMT]]></title><description><![CDATA[<p>Ist das standardkonform oder ein Feature deines Compilers?<br />
Habe auf die Schnelle nichts gefunden, aber ich musste das damals so lösen. Kann jetzt aber nicht ausschließen, dass das an der mangelnden Standardkonformität des Compilers (Borland) lag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169069</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 17 Jan 2012 11:24:43 GMT</pubDate></item><item><title><![CDATA[Reply to Keine spezialisierten template-methoden in klassen template? on Tue, 17 Jan 2012 13:54:13 GMT]]></title><description><![CDATA[<p>Templatespezialisierungen sind grundsätzlich auf Namensraumebene zu deklarieren.</p>
<p>DocShoes Delegation ist eine Variante. Möglich ist auch die Ersetzung der Rekursion durch eine Packexpansion. Damit erübrigt sich das Spezialisieren.<br />
z.B.</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;
#include &lt;tuple&gt;
#include &lt;iostream&gt;

template &lt;typename T&gt; struct identity
{
    typedef T type;
};

template &lt;std::size_t... i&gt; struct index_list
    : identity&lt;index_list&lt;i...&gt;&gt; {};

template &lt;typename&gt; struct append_index_list;
template &lt;std::size_t... i&gt; struct append_index_list&lt;index_list&lt;i...&gt;&gt;
    : identity&lt;index_list&lt;0, (i+1)...&gt;&gt; {};

template &lt;std::size_t N&gt; struct make_index_list
    : identity&lt;typename append_index_list&lt;typename make_index_list&lt;N-1&gt;::type&gt;::type&gt; {};
template &lt;&gt; struct make_index_list&lt;0&gt;
    : identity&lt;index_list&lt;&gt;&gt; {};

typedef int vm_t;

template &lt;int i&gt; struct callable { void operator()(vm_t) const { std::cout &lt;&lt; i &lt;&lt; '\n'; } };

template &lt;typename ... sub_words_t&gt;
class compound_t
{
public:
  compound_t(sub_words_t ... sub_words)
    : sub_words(sub_words ...)
  {  }

  void operator()(vm_t &amp;vm)
  {
    call_sub_words(vm,typename make_index_list&lt;sizeof...(sub_words_t)&gt;::type());
  }

private:
  static vm_t *vm;

  template&lt;std::size_t... i&gt;
  void call_sub_words(vm_t &amp;vm, index_list&lt;i...&gt;)
  {
    bool dummy[] = { ( std::get&lt;i&gt;(sub_words)(vm), false )... };
  }

  std::tuple&lt;sub_words_t ...&gt; sub_words;
};

template &lt;typename ... sub_words_t&gt;
vm_t* compound_t&lt;sub_words_t...&gt;::vm = 0;

int main()
{
    vm_t a = 0;
    compound_t&lt;callable&lt;0&gt;,callable&lt;1&gt;,callable&lt;2&gt;&gt; b((callable&lt;0&gt;()),callable&lt;1&gt;(),callable&lt;2&gt;());
    b(a);
}
</code></pre>
<p>(es ist garantiert, dass die einzelnen std::get-Aufrufe in der richtigen Reihenfolge ausgeführt werden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169132</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 17 Jan 2012 13:54:13 GMT</pubDate></item><item><title><![CDATA[Reply to Keine spezialisierten template-methoden in klassen template? on Wed, 18 Jan 2012 06:27:09 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>, Da hast Du aber Nägel reingehauen! <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/2169368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169368</guid><dc:creator><![CDATA[leftshift]]></dc:creator><pubDate>Wed, 18 Jan 2012 06:27:09 GMT</pubDate></item></channel></rss>