<?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 spezialisieren]]></title><description><![CDATA[<p>In einem anderen Thread hatte ich bereits geschrieben. Das ich eine Templatefunktion geschrieben habe um binäre und Hexadezimale Werte aus einem String in verschiedene integer konvertiere. Nun funktioniert das ja nicht mit dem Typen uint8_t und int8_t, da diese sich wie ein char verhalten. Gibt es die Möglichkeit, das Template so zu ändern, dass es für diese beiden Typen eine andere Konvertierung macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/256573/template-spezialisieren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 06:04:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256573.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Dec 2009 08:14:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 08:14:20 GMT]]></title><description><![CDATA[<p>In einem anderen Thread hatte ich bereits geschrieben. Das ich eine Templatefunktion geschrieben habe um binäre und Hexadezimale Werte aus einem String in verschiedene integer konvertiere. Nun funktioniert das ja nicht mit dem Typen uint8_t und int8_t, da diese sich wie ein char verhalten. Gibt es die Möglichkeit, das Template so zu ändern, dass es für diese beiden Typen eine andere Konvertierung macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822638</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Tue, 15 Dec 2009 08:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 08:27:17 GMT]]></title><description><![CDATA[<p>Was geht denn mit Spezialisierung nicht?</p>
<p>Im Fall wenn das lediglich typedefs auf den gleichen Typ sind, dann könntest du ja einen Wrapper für die Typen schreibeb, damit funktioniert dann auch die Unterscheidung.</p>
<p>Aber wenn es die gleichen Typen sind, dann sollte ja auch die genau gleiche Umwandlung funktionieren..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822648</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 15 Dec 2009 08:27:17 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 08:48:47 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Was geht denn mit Spezialisierung nicht?</p>
</blockquote>
<p>Das Problem ist, dass ich mich mit Templatespezialisierung nicht wirklich auskenne. Bei Wikipedia lese ich: &quot;Im Unterschied zu Klassentemplates sind Funktionstemplates nicht teilweise sondern nur vollständig spezialisierbar&quot;. Ich befürchte, damit ist genau das nicht möglich, was ich machen möchte.</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Im Fall wenn das lediglich typedefs auf den gleichen Typ sind, dann könntest du ja einen Wrapper für die Typen schreibeb, damit funktioniert dann auch die Unterscheidung.</p>
</blockquote>
<p>Das is ja gerade nicht der Fall. Abgesehen von den 8 bit &quot;ints&quot; die chars sind, sind die restlichen Typen wirkliche ints bzw. shorts oder longs. Daher brauche ich für die chars eine eigene Behandlung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822654</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Tue, 15 Dec 2009 08:48:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 11:03:27 GMT]]></title><description><![CDATA[<p>siecpp schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Was geht denn mit Spezialisierung nicht?</p>
</blockquote>
<p>Das Problem ist, dass ich mich mit Templatespezialisierung nicht wirklich auskenne. Bei Wikipedia lese ich: &quot;Im Unterschied zu Klassentemplates sind Funktionstemplates nicht teilweise sondern nur vollständig spezialisierbar&quot;. Ich befürchte, damit ist genau das nicht möglich, was ich machen möchte.</p>
</blockquote>
<p>Das bezieht sich auf Templates mit mehreren Parametern. Das was du machen willst klingt so, als wäre das kein Problem.</p>
<p>Schema:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; T string_to_T(std::string input)
{
// ...allgemein...
}

template &lt;&gt; char string_to_T&lt;char&gt;(std::string input)
{
// ...speziell...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822720</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2009 11:03:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 11:22:27 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das bezieht sich auf Templates mit mehreren Parametern. Das was du machen willst klingt so, als wäre das kein Problem.</p>
</blockquote>
<p>Wenn ich das so mache bekomme ich immer einen Liker Error wegen Mehrfachdefinition.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822730</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Tue, 15 Dec 2009 11:22:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 11:28:04 GMT]]></title><description><![CDATA[<p>siecpp schrieb:</p>
<blockquote>
<p>Wenn ich das so mache bekomme ich immer einen Liker Error wegen Mehrfachdefinition.</p>
</blockquote>
<p>Wenn du was wie machst? Stell mal vernünftige Fragen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822735</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2009 11:28:04 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 11:35:33 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wenn du was wie machst? Stell mal vernünftige Fragen!</p>
</blockquote>
<p>Wenn ich meinen Code gemäß deinem Beispiel ändere. Was war denn daran unverständlich?</p>
<pre><code class="language-cpp">template &lt; typename T &gt;
T convert(const std::string &amp;value,const std::string &amp;base)
{
// ...
}
template &lt;&gt;
uint8_t convert&lt;uint8_t&gt;(const std::string &amp;value,const std::string &amp;base)
{
//...
}
</code></pre>
<pre><code>./xmlParser.o: In function `_Z7convertIhET_RKSsS2_':
/cygdrive/d/Andreas/Tools/Workspace/testsuitnewsvn/Debug/../convert.h:63: multiple definition of `unsigned char convert&lt;unsigned char&gt;(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;)'
./main.o:/cygdrive/d/Andreas/Tools/Workspace/testsuitnewsvn/Debug/../convert.h:63: first defined here
collect2: ld returned 1 exit status
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822738</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Tue, 15 Dec 2009 11:35:33 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 11:46:27 GMT]]></title><description><![CDATA[<p>siecpp schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Wenn du was wie machst? Stell mal vernünftige Fragen!</p>
</blockquote>
<p>Wenn ich meinen Code gemäß deinem Beispiel ändere. Was war denn daran unverständlich?</p>
</blockquote>
<p>Das Zitat das du davor gebracht hast, hat mich verwirrt.</p>
<p>Zu deinem Fehler:<br />
Ahh, das hatte ich vergessen zu erwähnen: Ein vollständig spezialisiertes Template ist keine Template mehr (Template=Schablone), sondern eine vollständig definierte Funktion. Da du die Spezialisierung in einer Headerdatei stehen hast, hast du am Ende mehrere Definitionen der gleichen Funktion im Programm und das ist wie immer nicht erlaubt. Mögliche Abhilfen:<br />
- Templatespezialisierung aus dem Header nehmen und in eine der Source-Dateien schreiben.<br />
- Templatespezialisierung eine interne Bindung geben (mit inline)</p>
<p>Je nachdem, was für dich besser passt. Im Zweifelsfall würde ich die erste Methode nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822744</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2009 11:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 11:50:47 GMT]]></title><description><![CDATA[<p>Erstmal vielen Dank für die Informationen!</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Je nachdem, was für dich besser passt. Im Zweifelsfall würde ich die erste Methode nehmen.</p>
</blockquote>
<p>Wie macht man das am &quot;saubersten&quot;? Ne gleichnamige cpp Datei erstellen, die Spezialisierung reinkopieren und den Header includen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822746</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Tue, 15 Dec 2009 11:50:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 12:37:42 GMT]]></title><description><![CDATA[<p>siecpp schrieb:</p>
<blockquote>
<p>Wie macht man das am &quot;saubersten&quot;? Ne gleichnamige cpp Datei erstellen, die Spezialisierung reinkopieren und den Header includen?</p>
</blockquote>
<p>Ja, so würde ich das machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822786</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2009 12:37:42 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 12:42:45 GMT]]></title><description><![CDATA[<p>Hmm ich bekomme jetzt sehr seltsame Fehlermeldungen die ohne die Spezialisierungen nicht da waren:</p>
<pre><code>In file included from ../convert.cpp:16:
../convert.h: In function `T convert(const std::string&amp;, const std::string&amp;)':
../convert.h:34: error: no match for 'operator&gt;&gt;' in 'conv &gt;&gt; std::hex'
../convert.h:38: error: no match for 'operator&gt;&gt;' in 'conv &gt;&gt; std::dec'
../convert.h:42: error: no match for 'operator&gt;&gt;' in 'conv &gt;&gt; std::oct'
../convert.h:50: error: invalid use of undefined type `struct std::stringstream'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/iosfwd:84: error: declaration of `struct std::stringstream'
../convert.cpp: In function `T convert(const std::string&amp;, const std::string&amp;) [with T = uint8_t]':
../convert.cpp:22: error: variable `std::stringstream conv' has initializer but incomplete type
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822791</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Tue, 15 Dec 2009 12:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 12:49:13 GMT]]></title><description><![CDATA[<p>Fehlen da vielleicht noch ein paar includes? Zeig mal bitte etwas mehr Quelltext vom jetzigen Stand des Projekts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822796</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2009 12:49:13 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 12:52:35 GMT]]></title><description><![CDATA[<p>convert.h</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;bitset&gt;

template &lt; typename T &gt;
T convert(const std::string &amp;value,const std::string &amp;base)
{
  T ret;
std::stringstream conv(value);
if(base == &quot;hex&quot;)
  {
  conv &gt;&gt; std::hex &gt;&gt; ret;
  }
else if(base == &quot;dec&quot;)
  {
  conv &gt;&gt; std::dec &gt;&gt; ret;
  }
else if(base == &quot;oct&quot;)
  {
  conv &gt;&gt; std::oct &gt;&gt; ret;
  }
else
  {
    std::string error=&quot;parser error: unknown base type&quot;;
    throw error;
  }

  if (conv.fail())
    {
    std::string error=&quot;parser error: can't convert input value to expected type&quot;;
      throw error;
    }
  else
    {
      return ret;
    }

}
</code></pre>
<p>convert.cpp</p>
<pre><code class="language-cpp">#include &quot;convert.h&quot;

template &lt;&gt;
uint8_t convert&lt;uint8_t&gt;(const std::string &amp;value,const std::string &amp;base)
{
  unsigned short temp;
std::stringstream conv(value);
if(base == &quot;hex&quot;)
  {
  conv &gt;&gt; std::hex &gt;&gt; temp;
  }
else if(base == &quot;dec&quot;)
  {
  conv &gt;&gt; std::dec &gt;&gt; temp;
  }
else if(base == &quot;oct&quot;)
  {
  conv &gt;&gt; std::oct &gt;&gt; temp;
  }
else
  {
    std::string error=&quot;parser error: unknown base type&quot;;
    throw error;
  }

  if (conv.fail())
    {
    std::string error=&quot;parser error: can't convert input value to expected type&quot;;
      throw error;
    }
  else
    {
      return temp;
    }
}
</code></pre>
<p>Include guards habe ich weggelassen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822799</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Tue, 15 Dec 2009 12:52:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 13:20:35 GMT]]></title><description><![CDATA[<p>Du hast</p>
<pre><code class="language-cpp">#include &lt;sstream&gt;
</code></pre>
<p>vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822822</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2009 13:20:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 13:27:13 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Du hast</p>
<pre><code class="language-cpp">#include &lt;sstream&gt;
</code></pre>
<p>vergessen.</p>
</blockquote>
<p>Danke, jetzt bekomme ich wieder:</p>
<pre><code>./xmlParser.o: In function `_ZStoRRSt13_Ios_FmtflagsS_':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ios_base.h:(.text$_Z7convertIhET_RKSsS2_[unsigned char convert&lt;unsigned char&gt;(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;)]+0x0): multiple definition of `unsigned char convert&lt;unsigned char&gt;(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;)'
./convert.o:/cygdrive/d/Andreas/Tools/Workspace/testsuitnewsvn/Debug/../convert.cpp:20: first defined here
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822826</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Tue, 15 Dec 2009 13:27:13 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 13:47:28 GMT]]></title><description><![CDATA[<p>Das ist merkwürdig, der gcc macht da zumindest keine Zicken. Ich sehe da zwei mögliche Gründe:<br />
- Der Compiler macht sich jetzt für xmlparser.cpp seine eigene Spezialisierung des Templates mit unsigned char, weil es deine Spezialisierung in convert.cpp nicht kennt. Diese kollidiert dann später mit der anderen Version. Dagegen hilft eine Forwarddeklaration deiner Spezialisierung in der Header-Datei.<br />
- Du hast noch eine alte version der xmlparser.o, die noch die spezialisierte Version des Templates enthält von bevor du es ausgelagert hast. Dagegen hilft Neukompilieren des ganzen Projekts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822836</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2009 13:47:28 GMT</pubDate></item><item><title><![CDATA[Reply to Template spezialisieren on Tue, 15 Dec 2009 13:52:30 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das ist merkwürdig, der gcc macht da zumindest keine Zicken. Ich sehe da zwei mögliche Gründe:<br />
- Der Compiler macht sich jetzt für xmlparser.cpp seine eigene Spezialisierung des Templates mit unsigned char, weil es deine Spezialisierung in convert.cpp nicht kennt. Diese kollidiert dann später mit der anderen Version. Dagegen hilft eine Forwarddeklaration deiner Spezialisierung in der Header-Datei.<br />
- Du hast noch eine alte version der xmlparser.o, die noch die spezialisierte Version des Templates enthält von bevor du es ausgelagert hast. Dagegen hilft Neukompilieren des ganzen Projekts.</p>
</blockquote>
<p>Ersteres hat geholfen. Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822842</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Tue, 15 Dec 2009 13:52:30 GMT</pubDate></item></channel></rss>