<?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[Probleme bei Funktions-Template Spezialisierung]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich bin gerade dabei C++ zu lernen (Buch: Der C++ Programmierer).</p>
<p>Allerdings stoße ich bei einer Aufgabe auf Probleme, bzw. verstehe das Verhalten nicht.</p>
<p>Und zwar soll eine Template-Funktion &quot;getType&quot; den Variablentyp als String zurückgeben.</p>
<pre><code>//main.cpp
#include &lt;iostream&gt;
#include &lt;string&gt;
//#include &quot;gettype.h&quot;
//#include &quot;gettype_t.cpp&quot;
using namespace std;

template &lt;typename T&gt; string getType(T t) {
    cout &lt;&lt; &quot;unb&quot; &lt;&lt; endl;
}
template &lt;&gt; string getType&lt;int&gt;(int t) {
    cout &lt;&lt; &quot;INT&quot; &lt;&lt; endl;
}

template &lt;&gt; string getType&lt;unsigned int&gt;(unsigned int t) {
    cout &lt;&lt; &quot;UI&quot; &lt;&lt; endl;
}

template &lt;&gt; string getType&lt;char&gt;(char t) {
    cout &lt;&lt; &quot;CH&quot; &lt;&lt; endl;
}

template &lt;&gt; string getType&lt;bool&gt;(bool t) {
    cout &lt;&lt; &quot;BL&quot; &lt;&lt; endl;
}

int main()
{
    int i;
    cout &lt;&lt; getType(i) &lt;&lt; endl;
    unsigned int ui;
    cout &lt;&lt; getType(ui) &lt;&lt; endl;
    char c;
    cout &lt;&lt; getType(c) &lt;&lt; endl;
    bool b;
    cout &lt;&lt; getType(b) &lt;&lt; endl;
    float f;
    cout &lt;&lt; getType(f) &lt;&lt; endl;
}
</code></pre>
<p>Mir ist klar, dass ich hier keinen Wert zurückgebe und das Ergebnis direkt ausgebe, aber ich habe das nur zu Testzwecken so gemacht.</p>
<p>Die Fehlermelung lautet:</p>
<p>...\cppbuch\uebung3.10\main.cpp|11|multiple definition of `std::string getType&lt;int&gt;(int)'|</p>
<p>Warum wird die Funktion mehrere male definiert?</p>
<p>Und warum funktioniert das ohne Probleme wenn ich den Rückgabetyp ändere?:</p>
<pre><code>template &lt;typename T&gt; int getType(T t) {
    cout &lt;&lt; &quot;unb&quot; &lt;&lt; endl;
}
template &lt;&gt; int getType&lt;int&gt;(int t) {
    cout &lt;&lt; &quot;INT&quot; &lt;&lt; endl;
}

template &lt;&gt; int getType&lt;unsigned int&gt;(unsigned int t) {
    cout &lt;&lt; &quot;UI&quot; &lt;&lt; endl;
}

template &lt;&gt; int getType&lt;char&gt;(char t) {
    cout &lt;&lt; &quot;CH&quot; &lt;&lt; endl;
}

template &lt;&gt; int getType&lt;bool&gt;(bool t) {
    cout &lt;&lt; &quot;BL&quot; &lt;&lt; endl;
}
</code></pre>
<p>Geht auch mit jedem anderen Typ.</p>
<p>IDE: Code::Blocks 13.12<br />
Compiler: GNU GCC 4.8.2</p>
<p>Eine Lösung wie es funktioniert habe ich dann auch nach Recherche im Inet gefunden. Und zwar wird die allgemeine Funktions-template in einem Header definiert und die Spezialisierungen nur deklariert und dann in einem separaten File definiert.</p>
<p>So:</p>
<pre><code>#ifndef GETTYPE_H_INCLUDED
#define GETTYPE_H_INCLUDED

#include&lt;string&gt;

template&lt;typename T&gt; std::string getType(T t) {
    return &quot;Unbekannter Dateityp&quot;;
}
template&lt;&gt; std::string getType(int);
template&lt;&gt; std::string getType(unsigned int);
template&lt;&gt; std::string getType(char);
template&lt;&gt; std::string getType(bool);

#endif // GETTYPE_H_INCLUDED
</code></pre>
<p>Ich verstehe aber nicht ganz warum ich das so machen muss.</p>
<p>Danke für die Hilfe <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/333000/probleme-bei-funktions-template-spezialisierung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 07:57:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333000.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Jun 2015 18:34:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme bei Funktions-Template Spezialisierung on Thu, 04 Jun 2015 18:34:19 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich bin gerade dabei C++ zu lernen (Buch: Der C++ Programmierer).</p>
<p>Allerdings stoße ich bei einer Aufgabe auf Probleme, bzw. verstehe das Verhalten nicht.</p>
<p>Und zwar soll eine Template-Funktion &quot;getType&quot; den Variablentyp als String zurückgeben.</p>
<pre><code>//main.cpp
#include &lt;iostream&gt;
#include &lt;string&gt;
//#include &quot;gettype.h&quot;
//#include &quot;gettype_t.cpp&quot;
using namespace std;

template &lt;typename T&gt; string getType(T t) {
    cout &lt;&lt; &quot;unb&quot; &lt;&lt; endl;
}
template &lt;&gt; string getType&lt;int&gt;(int t) {
    cout &lt;&lt; &quot;INT&quot; &lt;&lt; endl;
}

template &lt;&gt; string getType&lt;unsigned int&gt;(unsigned int t) {
    cout &lt;&lt; &quot;UI&quot; &lt;&lt; endl;
}

template &lt;&gt; string getType&lt;char&gt;(char t) {
    cout &lt;&lt; &quot;CH&quot; &lt;&lt; endl;
}

template &lt;&gt; string getType&lt;bool&gt;(bool t) {
    cout &lt;&lt; &quot;BL&quot; &lt;&lt; endl;
}

int main()
{
    int i;
    cout &lt;&lt; getType(i) &lt;&lt; endl;
    unsigned int ui;
    cout &lt;&lt; getType(ui) &lt;&lt; endl;
    char c;
    cout &lt;&lt; getType(c) &lt;&lt; endl;
    bool b;
    cout &lt;&lt; getType(b) &lt;&lt; endl;
    float f;
    cout &lt;&lt; getType(f) &lt;&lt; endl;
}
</code></pre>
<p>Mir ist klar, dass ich hier keinen Wert zurückgebe und das Ergebnis direkt ausgebe, aber ich habe das nur zu Testzwecken so gemacht.</p>
<p>Die Fehlermelung lautet:</p>
<p>...\cppbuch\uebung3.10\main.cpp|11|multiple definition of `std::string getType&lt;int&gt;(int)'|</p>
<p>Warum wird die Funktion mehrere male definiert?</p>
<p>Und warum funktioniert das ohne Probleme wenn ich den Rückgabetyp ändere?:</p>
<pre><code>template &lt;typename T&gt; int getType(T t) {
    cout &lt;&lt; &quot;unb&quot; &lt;&lt; endl;
}
template &lt;&gt; int getType&lt;int&gt;(int t) {
    cout &lt;&lt; &quot;INT&quot; &lt;&lt; endl;
}

template &lt;&gt; int getType&lt;unsigned int&gt;(unsigned int t) {
    cout &lt;&lt; &quot;UI&quot; &lt;&lt; endl;
}

template &lt;&gt; int getType&lt;char&gt;(char t) {
    cout &lt;&lt; &quot;CH&quot; &lt;&lt; endl;
}

template &lt;&gt; int getType&lt;bool&gt;(bool t) {
    cout &lt;&lt; &quot;BL&quot; &lt;&lt; endl;
}
</code></pre>
<p>Geht auch mit jedem anderen Typ.</p>
<p>IDE: Code::Blocks 13.12<br />
Compiler: GNU GCC 4.8.2</p>
<p>Eine Lösung wie es funktioniert habe ich dann auch nach Recherche im Inet gefunden. Und zwar wird die allgemeine Funktions-template in einem Header definiert und die Spezialisierungen nur deklariert und dann in einem separaten File definiert.</p>
<p>So:</p>
<pre><code>#ifndef GETTYPE_H_INCLUDED
#define GETTYPE_H_INCLUDED

#include&lt;string&gt;

template&lt;typename T&gt; std::string getType(T t) {
    return &quot;Unbekannter Dateityp&quot;;
}
template&lt;&gt; std::string getType(int);
template&lt;&gt; std::string getType(unsigned int);
template&lt;&gt; std::string getType(char);
template&lt;&gt; std::string getType(bool);

#endif // GETTYPE_H_INCLUDED
</code></pre>
<p>Ich verstehe aber nicht ganz warum ich das so machen muss.</p>
<p>Danke für die Hilfe <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2455790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455790</guid><dc:creator><![CDATA[Mensch_mit_Hut]]></dc:creator><pubDate>Thu, 04 Jun 2015 18:34:19 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Funktions-Template Spezialisierung on Thu, 04 Jun 2015 18:44:34 GMT]]></title><description><![CDATA[<p>Dein erstes Beispiel compiliert bei mir überhaupt nicht. Du musst schon mindestens ein <code>return string();</code> einbauen. Dann funktioniert auch alles so wie es soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455791</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Thu, 04 Jun 2015 18:44:34 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Funktions-Template Spezialisierung on Thu, 04 Jun 2015 19:07:22 GMT]]></title><description><![CDATA[<p>Dein Code passt nicht so ganz zur Fehlermeldung.<br />
Aber dein zweiter Ansatz ist schon richtig.<br />
Eine Templatespezialisierung ist kein Template mehr und folglich auch nicht implizit inline. Sie muss also entweder als inline gekennzeichnet werden oder in einer .cpp Datei definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455792</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 04 Jun 2015 19:07:22 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Funktions-Template Spezialisierung on Thu, 04 Jun 2015 19:13:45 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Eine Templatespezialisierung ist kein Template mehr</p>
</blockquote>
<p>Hast du ganz im Ernst erwartet ich würde das einfach ignorieren? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455794</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 04 Jun 2015 19:13:45 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Funktions-Template Spezialisierung on Thu, 04 Jun 2015 19:24:59 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Eine Templatespezialisierung ist kein Template mehr</p>
</blockquote>
<p>Hast du ganz im Ernst erwartet ich würde das einfach ignorieren? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Ich habe nicht an dich gedacht, als ich das geschrieben habe. :p</p>
<p>Jaja, natürlich ist eine Templatespezialisierung ein Template, nur halt nicht mehr inline.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455796</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 04 Jun 2015 19:24:59 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Funktions-Template Spezialisierung on Thu, 04 Jun 2015 20:09:06 GMT]]></title><description><![CDATA[<p>Mensch_mit_Hut schrieb:</p>
<blockquote>
<p>Eine Lösung wie es funktioniert habe ich dann auch nach Recherche im Inet gefunden. Und zwar wird die allgemeine Funktions-template in einem Header definiert und die Spezialisierungen nur deklariert und dann in einem separaten File definiert.</p>
</blockquote>
<p>Nimm doch die Lösung zum Buch von der webseite und inkludiere</p>
<pre><code>#ifndef GETTYPE_T
#define GETTYPE_T
#include &lt;string&gt;

// Template
template &lt;typename T&gt;
std::string getType(T) { // Parametername wird nicht gebraucht
  return &quot;unbekannter Typ&quot;;
}

// Template-Spezialisierungen
template &lt;&gt; std::string getType(int) { return &quot;int&quot;; }
template &lt;&gt; std::string getType(unsigned int) {
  return &quot;unsigned int&quot;;
}
template &lt;&gt; std::string getType(double) { return &quot;double&quot;; }
template &lt;&gt; std::string getType(char) { return &quot;char&quot;; }
template &lt;&gt; std::string getType(bool) { return &quot;bool&quot;; }

#endif
</code></pre>
<p>in deinem main(). scheint mir das einfachste zu seim. und überall ist ein return.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455800</guid><dc:creator><![CDATA[include_templatte]]></dc:creator><pubDate>Thu, 04 Jun 2015 20:09:06 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Funktions-Template Spezialisierung on Thu, 04 Jun 2015 21:52:12 GMT]]></title><description><![CDATA[<p>Danke für die Antworten.</p>
<p>Habe jetzt verstanden woher die Fehlermeldung kam.<br />
Die Lösung habe ich gesehen. Allerdings habe ich anstatt einer &quot;gettype.t&quot; eine &quot;gettype_t.cpp&quot; erstellt und diese dann in die &quot;main.cpp&quot; eingebunden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> . Und bei meinen Versuchen war diese &quot;gettype_t.cpp&quot; immernoch im Projekt vorhanden.</p>
<p>Wenn ich das richtig verstanden habe, werden so die Templates zweimal definiert (auch wenn es beides mal das gleiche ist), was nicht mit der One Definition Rule zusammenpasst.</p>
<p>Jetzt läuft das wie es sein sollte und ich bin etwas schlauer <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455806</guid><dc:creator><![CDATA[Mensch_mit_Hut]]></dc:creator><pubDate>Thu, 04 Jun 2015 21:52:12 GMT</pubDate></item></channel></rss>