<?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[Anfängerfrage zu Templates]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich will eine Klasse schreiben, die eigentlich nur Werte eines verschiedenen Datentyps aufnehmen soll und bei Bedarf wieder zurück geben soll. Soweit so gut: Bei Instaziieren des Objektes, unterscheide ich die unterschiedlichen Typen durch überladenen Methoden. Nur die Rückgabe des Wertes bereitet mir ein paar Probleme. Ich dachte Templates waren das mittel der Wahl, aber irgendwie klappt das nicht.<br />
Ich poste mal die Klassendeklaration:</p>
<pre><code>#include &lt;string&gt;

using namespace std;

template &lt;typename T&gt;

class ALValue
{
public:
	ALValue(int param);
	ALValue(double param);
	ALValue(string param);
	string GetType();
	T GetValue();
	virtual ~ALValue();
private:
    string type;
};
</code></pre>
<p>g++ bringt mir dann einen Fehler an der Stelle class ALValue. Sinngemäß irgendwas mit fehlende Template Parameter.<br />
Könnte mir einer weiterhelfen was falsch ist? Oder hat vielleicht jemand für mein Problem eine bessere Lösung (evtl. mit Vererbung)?</p>
<p>Gruß und Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/209142/anfängerfrage-zu-templates</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 12:33:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209142.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 Mar 2008 10:23:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Anfängerfrage zu Templates on Thu, 27 Mar 2008 10:23:11 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich will eine Klasse schreiben, die eigentlich nur Werte eines verschiedenen Datentyps aufnehmen soll und bei Bedarf wieder zurück geben soll. Soweit so gut: Bei Instaziieren des Objektes, unterscheide ich die unterschiedlichen Typen durch überladenen Methoden. Nur die Rückgabe des Wertes bereitet mir ein paar Probleme. Ich dachte Templates waren das mittel der Wahl, aber irgendwie klappt das nicht.<br />
Ich poste mal die Klassendeklaration:</p>
<pre><code>#include &lt;string&gt;

using namespace std;

template &lt;typename T&gt;

class ALValue
{
public:
	ALValue(int param);
	ALValue(double param);
	ALValue(string param);
	string GetType();
	T GetValue();
	virtual ~ALValue();
private:
    string type;
};
</code></pre>
<p>g++ bringt mir dann einen Fehler an der Stelle class ALValue. Sinngemäß irgendwas mit fehlende Template Parameter.<br />
Könnte mir einer weiterhelfen was falsch ist? Oder hat vielleicht jemand für mein Problem eine bessere Lösung (evtl. mit Vererbung)?</p>
<p>Gruß und Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481215</guid><dc:creator><![CDATA[Emmerell]]></dc:creator><pubDate>Thu, 27 Mar 2008 10:23:11 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage zu Templates on Thu, 27 Mar 2008 10:26:03 GMT]]></title><description><![CDATA[<p>Sinngemäß wird wohl irgendwo ein Template-Parameter fehlen.</p>
<p>Willst Du genaue Informationen, lohnt es sich die genaue Fehlermeldung anzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481218</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 27 Mar 2008 10:26:03 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage zu Templates on Thu, 27 Mar 2008 12:05:51 GMT]]></title><description><![CDATA[<p>Schau dir mal boost::any an, das koennte dein Problem loesen. Und noch eine KLeinigkeit, die mir aufgefallen ist: du benutzt ein &quot;using namespace std&quot; im Zusammenhang mit templates. Da temapltes aber eigentlich immer in headern definiert werden, benutzt du folglich unsing namespace std in einem header, und das solltest du tunlichst vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481294</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 27 Mar 2008 12:05:51 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage zu Templates on Thu, 27 Mar 2008 14:26:12 GMT]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>also hier ist die genaue Fehlermeldung vom COmpiler:</p>
<pre><code>**** Build of configuration Debug for project ALValue_Test ****

make -k all 
Building file: ../ALValue.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF&quot;ALValue.d&quot; -MT&quot;ALValue.d&quot; -o&quot;ALValue.o&quot; &quot;../ALValue.cpp&quot;
../ALValue.cpp:4: Fehler: »template&lt;class T&gt; class ALValue« ohne Template-Parameter verwendet
../ALValue.cpp:4: Fehler: ISO-C++ verbietet Deklaration von »ALValue« ohne Typ
../ALValue.cpp: In function »int ALValue(int)«:
../ALValue.cpp:4: Fehler: »int ALValue(int)« als andere Symbolart redeklariert
../ALValue.h:5: Fehler: vorherige Deklaration von »template&lt;class T&gt; class ALValue«
../ALValue.cpp:6: Fehler: »type« wurde in diesem Gültigkeitsbereich nicht definiert
../ALValue.cpp: At global scope:
../ALValue.cpp:9: Fehler: »template&lt;class T&gt; class ALValue« ohne Template-Parameter verwendet
../ALValue.cpp:9: Fehler: ISO-C++ verbietet Deklaration von »ALValue« ohne Typ
../ALValue.cpp: In function »int ALValue(double)«:
../ALValue.cpp:9: Fehler: »int ALValue(double)« als andere Symbolart redeklariert
../ALValue.h:5: Fehler: vorherige Deklaration von »template&lt;class T&gt; class ALValue«
../ALValue.cpp:11: Fehler: »type« wurde in diesem Gültigkeitsbereich nicht definiert
../ALValue.cpp: At global scope:
../ALValue.cpp:14: Fehler: »template&lt;class T&gt; class ALValue« ohne Template-Parameter verwendet
../ALValue.cpp:14: Fehler: ISO-C++ verbietet Deklaration von »ALValue« ohne Typ
../ALValue.cpp: In function »int ALValue(std::string)«:
../ALValue.cpp:14: Fehler: »int ALValue(std::string)« als andere Symbolart redeklariert
../ALValue.h:5: Fehler: vorherige Deklaration von »template&lt;class T&gt; class ALValue«
../ALValue.cpp:16: Fehler: »type« wurde in diesem Gültigkeitsbereich nicht definiert
../ALValue.cpp: At global scope:
../ALValue.cpp:19: Fehler: »template&lt;class T&gt; class ALValue« ohne Template-Parameter verwendet
../ALValue.cpp: In function »std::string GetType()«:
../ALValue.cpp:21: Fehler: »type« wurde in diesem Gültigkeitsbereich nicht definiert
../ALValue.cpp: At global scope:
../ALValue.cpp:24: Fehler: expected constructor, destructor, or type conversion before »::« token
make: *** [ALValue.o] Fehler 1
Building file: ../main.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF&quot;main.d&quot; -MT&quot;main.d&quot; -o&quot;main.o&quot; &quot;../main.cpp&quot;
../main.cpp: In function »int main()«:
../main.cpp:9: Fehler: Templateargument 2 ist ungültig
../main.cpp:9: Fehler: Templateargument 4 ist ungültig
../main.cpp:9: Fehler: invalid type in declaration before »;« token
../main.cpp:10: Fehler: expected type-specifier before »ALValue«
../main.cpp:10: Fehler: assignment of read-only location
../main.cpp:10: Fehler: ungültige Umwandlung von »int*« in »char«
../main.cpp:10: Fehler: expected `;' before »ALValue«
../main.cpp:11: Fehler: expected type-specifier before »ALValue«
../main.cpp:11: Fehler: assignment of read-only location
../main.cpp:11: Fehler: ungültige Umwandlung von »int*« in »char«
../main.cpp:11: Fehler: expected `;' before »ALValue«
../main.cpp:12: Fehler: expected type-specifier before »ALValue«
../main.cpp:12: Fehler: assignment of read-only location
../main.cpp:12: Fehler: ungültige Umwandlung von »int*« in »char«
../main.cpp:12: Fehler: expected `;' before »ALValue«
../main.cpp:13: Fehler: expected type-specifier before »ALValue«
../main.cpp:13: Fehler: assignment of read-only location
../main.cpp:13: Fehler: ungültige Umwandlung von »int*« in »char«
../main.cpp:13: Fehler: expected `;' before »ALValue«
../main.cpp:14: Fehler: Basisoperand von »-&gt;« ist kein Zeiger
make: *** [main.o] Fehler 1
make: Das Target »all« wurde wegen Fehlern nicht aktualisiert.
Build complete for project ALValue_Test
</code></pre>
<p>Ich poste auch mal noch den kompletten Testcode (ist nicht so viel <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="😉"
    /> ). Vielleicht weiß dann einer von euch weiter:</p>
<pre><code>#include &quot;ALValue.h&quot;
#include &lt;stdio.h&gt;
#include &lt;map&gt;

using namespace std;

int main ()
{
	map&lt;string,ALValue*&gt; TestMap;
	TestMap[&quot;Test1&quot;] = new ALValue(&quot;Test&quot;);
	TestMap[&quot;Test2&quot;] = new ALValue(1);
	TestMap[&quot;Test3&quot;] = new ALValue(1.1);
	TestMap[&quot;Test4&quot;] = new ALValue(&quot;Test2&quot;);
        printf(&quot;%s\n&quot;,TestMap[&quot;Test1&quot;]-&gt;GetType().c_str());
	return 0;
}
</code></pre>
<pre><code>#include &quot;ALValue.h&quot;

ALValue::ALValue(int param)
{
	type = &quot;int&quot;;
}

ALValue::ALValue(double param)
{
	type = &quot;double&quot;;
}

ALValue::ALValue(std::string param)
{
	type = &quot;string&quot;;
}

std::string ALValue::GetType()
{
	return type;
}

ALValue::~ALValue()
{
}
</code></pre>
<pre><code>#include &lt;string&gt;
template &lt;typename T&gt;

class ALValue
{
public:
	ALValue(int param);
	ALValue(double param);
	ALValue(std::string param);
	std::string GetType();
	T GetValue();
	virtual ~ALValue();
private:
        std::string type;
};
</code></pre>
<p>Wenn ich die beiden Zeilen mit der Template rauslasse, funktioniert es dann auch, aber dann kann ich eben nicht typunabhänig den Wert zurückgeben.<br />
Boost werde ich mir mal anschauen, aber irgendwie wäre es mir lieber wenn ich eine eigene Lösung hätte. Kann ja eigentlich auch nicht so viel sein, denke ich mal.<br />
Das mit dem Namespace habe ich auch rausgenommen. Danke für den Hinweis :-).</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481471</guid><dc:creator><![CDATA[Emmerell]]></dc:creator><pubDate>Thu, 27 Mar 2008 14:26:12 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage zu Templates on Thu, 27 Mar 2008 15:46:28 GMT]]></title><description><![CDATA[<p>Es fehlt</p>
<pre><code class="language-cpp">#include &quot;ALValue.cpp&quot; oder wie deine Datei auch immer heißt
</code></pre>
<p>unter</p>
<pre><code class="language-cpp">#include &lt;string&gt; 
template &lt;typename T&gt; 

class ALValue 
{ 
public: 
    ALValue(int param); 
    ALValue(double param); 
    ALValue(std::string param); 
    std::string GetType(); 
    T GetValue(); 
    virtual ~ALValue(); 
private: 
        std::string type; 
};

#include &quot;ALValue.cpp&quot; &lt;&lt;== fehlt
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1481500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481500</guid><dc:creator><![CDATA[EEK]]></dc:creator><pubDate>Thu, 27 Mar 2008 15:46:28 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage zu Templates on Thu, 27 Mar 2008 16:17:19 GMT]]></title><description><![CDATA[<p>Genau hier ist dein Problem:</p>
<pre><code class="language-cpp">map&lt;string,ALValue*&gt; TestMap;
</code></pre>
<p>Du musst den Template-Parameter schon bei der Benutztung angeben. Das ist der Sinn von Templates.</p>
<p>Es könnte z.B. so gehen.</p>
<pre><code class="language-cpp">map&lt;string,ALValue&lt;int&gt;* &gt; TestMap;
</code></pre>
<p>Übrigens: Nein, dein Problem ist nicht ganz so einfach. Wenn du schnell mit deinem Problem weiter kommen willst, solltest du Boost::any nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481553</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 27 Mar 2008 16:17:19 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage zu Templates on Thu, 27 Mar 2008 17:40:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class BasicALValue
{
   virtual ~BasicALValue() {};
};

template &lt;typename T&gt;
class ALValue : public BasicALValue
{
public:
    ALValue( T Value ) : m_Value(Value)
    {
    }

    ~ALValue();
    {
    }

    void SetValue( T&amp; NewValue )
    { 
        m_Value = NewValue;
    }

    T GetValue()
    {
        return m_Value;
    }
private:
    T m_Value;
};
</code></pre>
<p>Main.cpp</p>
<pre><code class="language-cpp">int main ()
{
    std::map&lt;std::wstring, BasicALValue*&gt; TestMap;

    TestMap[L&quot;Test1&quot;] = new ALValue&lt;int&gt;(10);
    TestMap[L&quot;Test2&quot;] = new ALValue&lt;std::wstring&gt;(L&quot;Toll!&quot;);
    TestMap[L&quot;Test3&quot;] = new ALValue&lt;bool&gt;(true);

    return 0;
}
</code></pre>
<p>so sollte es einfach funktionieren, ohne den Umweg über Strings gegangen zu sein.</p>
<p>hier:<br />
<a href="http://www.gamedev.net/reference/programming/features/enginuity3/page2.asp" rel="nofollow">http://www.gamedev.net/reference/programming/features/enginuity3/page2.asp</a><br />
ist übrigens noch ein netter Link der soetwas ähnliches macht wie du möchtest</p>
<p>'hoffe das hilft!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481605</guid><dc:creator><![CDATA[Muraha]]></dc:creator><pubDate>Thu, 27 Mar 2008 17:40:39 GMT</pubDate></item></channel></rss>