<?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[[gelöst] templates für Typen definieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich baue gerade ein Template, dass intern Listen und Vektoren bearbeiten und verwalten soll. Dazu müsste ich aber bei meiner Funktion Iterator-Suchen ein paar Typen unterscheiden. Folgendes habe ich nun versucht:</p>
<pre><code class="language-cpp">// Auszug .h
template &lt;typename Arg_Type, typename Inlay_Type&gt;
class ListSort
{
protected:
  Arg_Type* arg1; // Zeiger auf das Objekt, dass verwaltet werden soll.

public:
  /* c'tor */
  ListSort(Arg_Type* newArg);

  /* Position suchen */
  typename Arg_Type::iterator&amp; ListeFindIterator(const size_t&amp; thePosToMove);

  // .. viele andere Funktionen
};

// Auszug .cpp

/* Position suchen */
// -&gt; Für alles was ich nicht unterstütze
template &lt;typename Arg_Type, typename Inlay_Type&gt;
typename Arg_Type::iterator&amp; ListSort&lt;Arg_Type, Inlay_Type&gt;::ListeFindIterator(const size_t&amp; /* thePosToMove */)
{
  return arg1-&gt;end();
  // Suchfunktion nicht unterstützt, also end(),
  // damit Funktionsaufrufer aussteigen.
}
// -&gt; Vector
template &lt;typename Arg_Type, typename Inlay_Type&gt;
typename Arg_Type::iterator&amp; ListSort&lt;std::vector&lt;Inlay_Type&gt;, Inlay_Type&gt;::ListeFindIterator(const size_t&amp; /* thePosToMove */)
{
  // Hier kommt dann die eigene Find-Funktion für vector hin.
  return arg1-&gt;end();
}
// -&gt; List
// -&gt; etc

// Beispiel für Definition:
typedef MLObject* MLObjectListeInlay;
typedef std::vector&lt;MLObjectListeInlay&gt; MLObjectListe;

MLObjectListe MyListe;
ListSort&lt;MLObjectListe, MLObjectListeInlay&gt; ListeVerwaltung(&amp;MyListe);
</code></pre>
<p>Leider stigt mir mein Visual Studio Por 2008 hier mit dem Fehler aus:</p>
<pre><code>error C3860: Eine template-Argumentliste, die dem Klassen-template-Namen folgt, muss Parameter in der in der template-Parameterliste verwendeten Reihenfolge auflisten.
error C2995: &quot;Arg_Type::iterator &amp;ListSort&lt;Arg_Type,Inlay_Type&gt;::ListeFindIterator(const size_t &amp;)&quot;: Funktionsvorlage wurde bereits definiert.
</code></pre>
<p>Natürlich weiß ich das ein Template universal gestaltet sein soll und das ist auch die einzige Funktion in dem ganzen Klassen-Teplate, die ich für die Typen vector, list, etc unterschiedlich gestalten muss.</p>
<p>Ich hab diese Schreibweise aus verschiedenen Internetseiten und Tutorials übernommen. Leider gibt mir aber keines meiner schlauen Bücher (so aus Papier und gebunden) ein Beispiel dafür, so dass ich vermute, &quot;das Internet lügt&quot;.</p>
<p>Wie müsste ich denn richtig schreiben? Wo finde ich (brauchbare) Lektüre für diesen Fall?</p>
<p>Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/278965/gelöst-templates-für-typen-definieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 20:19:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/278965.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Dec 2010 13:26:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] templates für Typen definieren on Thu, 16 Dec 2010 15:06:37 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich baue gerade ein Template, dass intern Listen und Vektoren bearbeiten und verwalten soll. Dazu müsste ich aber bei meiner Funktion Iterator-Suchen ein paar Typen unterscheiden. Folgendes habe ich nun versucht:</p>
<pre><code class="language-cpp">// Auszug .h
template &lt;typename Arg_Type, typename Inlay_Type&gt;
class ListSort
{
protected:
  Arg_Type* arg1; // Zeiger auf das Objekt, dass verwaltet werden soll.

public:
  /* c'tor */
  ListSort(Arg_Type* newArg);

  /* Position suchen */
  typename Arg_Type::iterator&amp; ListeFindIterator(const size_t&amp; thePosToMove);

  // .. viele andere Funktionen
};

// Auszug .cpp

/* Position suchen */
// -&gt; Für alles was ich nicht unterstütze
template &lt;typename Arg_Type, typename Inlay_Type&gt;
typename Arg_Type::iterator&amp; ListSort&lt;Arg_Type, Inlay_Type&gt;::ListeFindIterator(const size_t&amp; /* thePosToMove */)
{
  return arg1-&gt;end();
  // Suchfunktion nicht unterstützt, also end(),
  // damit Funktionsaufrufer aussteigen.
}
// -&gt; Vector
template &lt;typename Arg_Type, typename Inlay_Type&gt;
typename Arg_Type::iterator&amp; ListSort&lt;std::vector&lt;Inlay_Type&gt;, Inlay_Type&gt;::ListeFindIterator(const size_t&amp; /* thePosToMove */)
{
  // Hier kommt dann die eigene Find-Funktion für vector hin.
  return arg1-&gt;end();
}
// -&gt; List
// -&gt; etc

// Beispiel für Definition:
typedef MLObject* MLObjectListeInlay;
typedef std::vector&lt;MLObjectListeInlay&gt; MLObjectListe;

MLObjectListe MyListe;
ListSort&lt;MLObjectListe, MLObjectListeInlay&gt; ListeVerwaltung(&amp;MyListe);
</code></pre>
<p>Leider stigt mir mein Visual Studio Por 2008 hier mit dem Fehler aus:</p>
<pre><code>error C3860: Eine template-Argumentliste, die dem Klassen-template-Namen folgt, muss Parameter in der in der template-Parameterliste verwendeten Reihenfolge auflisten.
error C2995: &quot;Arg_Type::iterator &amp;ListSort&lt;Arg_Type,Inlay_Type&gt;::ListeFindIterator(const size_t &amp;)&quot;: Funktionsvorlage wurde bereits definiert.
</code></pre>
<p>Natürlich weiß ich das ein Template universal gestaltet sein soll und das ist auch die einzige Funktion in dem ganzen Klassen-Teplate, die ich für die Typen vector, list, etc unterschiedlich gestalten muss.</p>
<p>Ich hab diese Schreibweise aus verschiedenen Internetseiten und Tutorials übernommen. Leider gibt mir aber keines meiner schlauen Bücher (so aus Papier und gebunden) ein Beispiel dafür, so dass ich vermute, &quot;das Internet lügt&quot;.</p>
<p>Wie müsste ich denn richtig schreiben? Wo finde ich (brauchbare) Lektüre für diesen Fall?</p>
<p>Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995330</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Thu, 16 Dec 2010 15:06:37 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] templates für Typen definieren on Thu, 16 Dec 2010 15:05:49 GMT]]></title><description><![CDATA[<p>Hi stefanjann,</p>
<p>im Prinzip versuchst du ja das hier:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

template &lt;typename T, typename U&gt;
class C {
    void F();
};

template &lt;typename T, typename U&gt;
void C&lt;T, U&gt;::F() {
}

// Geht nicht.
template &lt;typename T, typename U&gt;
void C&lt;std::vector&lt;U&gt;, U&gt;::F() {
}

int main() {
    return 0;
}
</code></pre>
<p>(Member-)Funktionstemplates kann man aber nicht einfach so partiell spezialisieren. Dafür muss man erst die Klasse partiell spezialisieren.</p>
<p>Das säh in dem Beispiel dann so aus:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

template &lt;typename T, typename U&gt;
class C {
    void F();
};

template &lt;typename T, typename U&gt;
void C&lt;T, U&gt;::F() {
}

template &lt;typename U&gt;
class C&lt;std::vector&lt;U&gt;, U&gt; {
    void F();
};

template &lt;typename U&gt;
void C&lt;std::vector&lt;U&gt;, U&gt;::F() {
}
</code></pre>
<p>In welchem Buch du sowas findest, kann ich dir jetzt auch leider nicht sagen.<br />
Ich denke mal &quot;C++ Templates: The Complete Guide&quot; oder &quot;Modern C++ Design: Generic Programming and Design Patterns Applied&quot; könnten das aber drin haben. <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>
<p>Edit: Hier stehts auch:<br />
<a href="http://www.gotw.ca/publications/mill17.htm" rel="nofollow">http://www.gotw.ca/publications/mill17.htm</a></p>
<p>Gruß<br />
Dobi</p>
<p>PS: Weiß jemand, ob im neuen Standard (Member-)Funktionstemplates partiell spezialisiert werden können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995385</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Thu, 16 Dec 2010 15:05:49 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] templates für Typen definieren on Thu, 16 Dec 2010 15:06:22 GMT]]></title><description><![CDATA[<p>Danke schön,<br />
so gehts. Compiler machts das jetzt.</p>
<p>Jetzt kommt noch der Praxis-Test.</p>
<p>Grüße,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995389</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Thu, 16 Dec 2010 15:06:22 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] templates für Typen definieren on Fri, 17 Dec 2010 08:29:34 GMT]]></title><description><![CDATA[<p>Falls du noch an einer anderen (eventuell eleganteren) Lösung Interesse hast:<br />
Manchmal kanns ja ziemlich nervig sein, die komplette Klasse partiell spezialisieren zu müssen, obwohl du das ja eigentlich nur für eine Memberfunktion haben wolltest.<br />
Deshalb kann man die partielle Spezialisierung von Funktionen mit Operatorüberladung simulieren.<br />
Das ganze findest du in &quot;Modern C++ Design&quot; in Kapitel 2.5 oder hier:<br />
<a href="http://accu.org/index.php/journals/385" rel="nofollow">http://accu.org/index.php/journals/385</a></p>
<p>Gruß<br />
Dobi</p>
<p>PS: Es sieht so aus, als sei es mit 0x auch nicht anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995675</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Fri, 17 Dec 2010 08:29:34 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] templates für Typen definieren on Fri, 17 Dec 2010 08:37:57 GMT]]></title><description><![CDATA[<p>Danke für den Hinweis, ich schau mir das mal in Ruhe an.</p>
<p>Glücklicherweise hab ich mein Tamplate jetzt auch so hingekommen, dann ich es nicht mehr spezialisieren muss. std::advance sei dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995684</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Fri, 17 Dec 2010 08:37:57 GMT</pubDate></item></channel></rss>