<?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[wieso funktioniert dieses template nicht?]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename T,typename U=T&gt;
struct Pair
{
 T first;
 U second;

 Pair(const T&amp; a,const U&amp; b):first(a),second(b){}
 Pair(const Pair&amp; Obj):first(Obj.first),second(Obj.second){}
 Pair&amp; operator=(const Pair&amp;);

};

template&lt;typename T,typename U&gt;
Pair&lt;T,U&gt;&amp;::Pair&lt;T,U&gt; operator=(const Pair&lt;T,U&gt;&amp; Obj)
{
 first = Obj.first;
 second = Obj.second;
}
</code></pre>
<p>Fehler:</p>
<pre><code>[C++ Fehler] Unit1.cpp(29): E2428 Templates müssen Klassen oder Funktionen sein
[C++ Fehler] Unit1.cpp(29): E2238 Bezeichner 'Pair&lt;T,U&gt;' mehrfach deklariert
[C++ Fehler] Unit1.cpp(18): E2344 'Pair&lt;T,U&gt;' bereits deklariert
[C++ Fehler] Unit1.cpp(29): E2356 Redeklaration von 'Pair&lt;T,U&gt;' mit anderem Typ
[C++ Fehler] Unit1.cpp(18): E2344 'Pair&lt;T,U&gt;' bereits deklariert
[C++ Fehler] Unit1.cpp(29): E2141 Fehler in der Deklarationssyntax
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/139491/wieso-funktioniert-dieses-template-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 13:23:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/139491.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Mar 2006 09:38:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wieso funktioniert dieses template nicht? on Tue, 07 Mar 2006 09:38:50 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename T,typename U=T&gt;
struct Pair
{
 T first;
 U second;

 Pair(const T&amp; a,const U&amp; b):first(a),second(b){}
 Pair(const Pair&amp; Obj):first(Obj.first),second(Obj.second){}
 Pair&amp; operator=(const Pair&amp;);

};

template&lt;typename T,typename U&gt;
Pair&lt;T,U&gt;&amp;::Pair&lt;T,U&gt; operator=(const Pair&lt;T,U&gt;&amp; Obj)
{
 first = Obj.first;
 second = Obj.second;
}
</code></pre>
<p>Fehler:</p>
<pre><code>[C++ Fehler] Unit1.cpp(29): E2428 Templates müssen Klassen oder Funktionen sein
[C++ Fehler] Unit1.cpp(29): E2238 Bezeichner 'Pair&lt;T,U&gt;' mehrfach deklariert
[C++ Fehler] Unit1.cpp(18): E2344 'Pair&lt;T,U&gt;' bereits deklariert
[C++ Fehler] Unit1.cpp(29): E2356 Redeklaration von 'Pair&lt;T,U&gt;' mit anderem Typ
[C++ Fehler] Unit1.cpp(18): E2344 'Pair&lt;T,U&gt;' bereits deklariert
[C++ Fehler] Unit1.cpp(29): E2141 Fehler in der Deklarationssyntax
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1010316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1010316</guid><dc:creator><![CDATA[sadasd]]></dc:creator><pubDate>Tue, 07 Mar 2006 09:38:50 GMT</pubDate></item><item><title><![CDATA[Reply to wieso funktioniert dieses template nicht? on Tue, 07 Mar 2006 09:51:25 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Wetten der Fehler liegt hier:</p>
<pre><code class="language-cpp">Pair&lt;T,U&gt;&amp;::Pair&lt;T,U&gt; operator=(const Pair&lt;T,U&gt;&amp; Obj)
</code></pre>
<p>Eher so:</p>
<pre><code class="language-cpp">Pair&lt;T,U&gt;&amp; Pair&lt;T,U&gt;::operator=(const Pair&lt;T,U&gt;&amp; Obj)
</code></pre>
<p>Du solltest außerdem *this zurückgeben... Weil du als Rückgabewert ja Pair&lt;T,U&gt;&amp; definiert hast.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1010322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1010322</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 07 Mar 2006 09:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to wieso funktioniert dieses template nicht? on Tue, 07 Mar 2006 10:18:36 GMT]]></title><description><![CDATA[<p>jap, und eine Prüfung auf Selbstzuweisung muss auch rein:</p>
<pre><code class="language-cpp">template&lt;typename T,typename U&gt;
Pair&lt;T,U&gt;&amp; Pair&lt;T,U&gt;::operator=(const Pair&lt;T,U&gt;&amp; Obj) {
  if (this == &amp;Obj)
    return *this;

  first = Obj.first;
  second = Obj.second;
  return *this;
};
</code></pre>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1010352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1010352</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Tue, 07 Mar 2006 10:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to wieso funktioniert dieses template nicht? on Tue, 07 Mar 2006 10:26:23 GMT]]></title><description><![CDATA[<p>&quot;[C++ Fehler] Unit1.cpp(29): E2428 Templates müssen Klassen oder Funktionen sein&quot;</p>
<p>das würde ich auch noch beachten, wenn der compiler schon darauf hinweist <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>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1010362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1010362</guid><dc:creator><![CDATA[ERROR]]></dc:creator><pubDate>Tue, 07 Mar 2006 10:26:23 GMT</pubDate></item><item><title><![CDATA[Reply to wieso funktioniert dieses template nicht? on Tue, 07 Mar 2006 10:33:14 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>jap, und eine Prüfung auf Selbstzuweisung muss auch rein:<br />
[...]</p>
</blockquote>
<p>wozu sollte man sowas machen müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1010368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1010368</guid><dc:creator><![CDATA[wozu?]]></dc:creator><pubDate>Tue, 07 Mar 2006 10:33:14 GMT</pubDate></item><item><title><![CDATA[Reply to wieso funktioniert dieses template nicht? on Tue, 07 Mar 2006 10:36:38 GMT]]></title><description><![CDATA[<p>wozu? schrieb:</p>
<blockquote>
<p>GPC schrieb:</p>
<blockquote>
<p>jap, und eine Prüfung auf Selbstzuweisung muss auch rein:<br />
[...]</p>
</blockquote>
<p>wozu sollte man sowas machen müssen?</p>
</blockquote>
<p>Weil eine Selbstzuweisung unsinnig ist, wieso sollte es sinnvoll sein, einem Objekt die Werte, die es ohnehin schon hat, nochmal zuzuweisen? Kostet nur. Bei der Pair-Klasse kann das schon Auswirkungen haben, denn der erste Template-Parameter könnte eine große Klasse mit einigen Membern sein, die dann auch noch unnötig kopiert werden.</p>
<p>Klar, du würdest nicht</p>
<pre><code class="language-cpp">struct Foo {
  //...
};

Foo x;
x = x;
</code></pre>
<p>schreiben, aber weißt du, was hinter jeder Referenz, jedem Pointer oder SmartPointer steckt? Ich nicht.</p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1010374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1010374</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Tue, 07 Mar 2006 10:36:38 GMT</pubDate></item><item><title><![CDATA[Reply to wieso funktioniert dieses template nicht? on Tue, 07 Mar 2006 10:37:03 GMT]]></title><description><![CDATA[<p>naja, hier viell nich dringend notwendig!<br />
aber wenn du mit dynamischen objekten arbeitest ist es besser!</p>
<p>denn im zuweisungsoperator löscht du das alte objekt, damit das neue zugeordnet werden kann!</p>
<p>bei einer selbstzuweisung löscht du etwas, und willst dann deinem neuen objekt das gelöschte zuordnen, geht ja nicht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1010375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1010375</guid><dc:creator><![CDATA[ser1al(ausgeloggt)]]></dc:creator><pubDate>Tue, 07 Mar 2006 10:37:03 GMT</pubDate></item><item><title><![CDATA[Reply to wieso funktioniert dieses template nicht? on Tue, 07 Mar 2006 13:24:03 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>jap, und eine Prüfung auf Selbstzuweisung muss auch rein</p>
</blockquote>
<p>IdR nicht.</p>
<p>GPC schrieb:</p>
<blockquote>
<p>Weil eine Selbstzuweisung unsinnig ist, wieso sollte es sinnvoll sein, einem Objekt die Werte, die es ohnehin schon hat, nochmal zuzuweisen? Kostet nur.</p>
</blockquote>
<p>Was unsinnig ist, ist die Abfrage auf Selbstzuweisung. Selbstzuweisung tritt so gut wie nie auf, daher zu vernachlässigen. Wozu sollte man also jeder Zuweisung den Overhead der Abfrage aufzwingen, wenn das praktisch nutzlos ist? Eine Abfrage macht nur dann Sinn und sollte auch nur dann verwendet werden, wenn sich sonst logische Fehler ergeben. Und selbst bei dynamischen Objekten ist die Abfrgae auf Selbstzuweisung nicht zwangsläufig notwendig.</p>
<p>ser1al(ausgeloggt) schrieb:</p>
<blockquote>
<p>denn im zuweisungsoperator löscht du das alte objekt, damit das neue zugeordnet werden kann!</p>
<p>bei einer selbstzuweisung löscht du etwas, und willst dann deinem neuen objekt das gelöschte zuordnen, geht ja nicht!</p>
</blockquote>
<p>Deshalb macht man das auch nicht so. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> neuen Speicher anfordern, Daten kopieren, alten Speicher freigeben ... dann gibt's auch keine Probleme</p>
<p>@sadasd<br />
Lass den copy ctor und copy op einfach weg, das kann dein Compiler schon selber. Sowas ist nur in bestimmten Situationen notwendig, zB wenn deine Klasse Member hat, welchen dynamischer Speicher zugewiesen wurde, wo sonst Speicherlöcher entstehen würden. In diesem Zusammenhang solltest du dir auch mal <a href="http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=BigThree#Answ" rel="nofollow">Law of the big three</a> anschauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1010511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1010511</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 07 Mar 2006 13:24:03 GMT</pubDate></item><item><title><![CDATA[Reply to wieso funktioniert dieses template nicht? on Tue, 07 Mar 2006 19:34:24 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>GPC schrieb:</p>
<blockquote>
<p>Weil eine Selbstzuweisung unsinnig ist, wieso sollte es sinnvoll sein, einem Objekt die Werte, die es ohnehin schon hat, nochmal zuzuweisen? Kostet nur.</p>
</blockquote>
<p>Was unsinnig ist, ist die Abfrage auf Selbstzuweisung. Selbstzuweisung tritt so gut wie nie auf, daher zu vernachlässigen.</p>
</blockquote>
<p>Kannst du das irgendwie belegen, oder ist das jetzt halt so aus deiner Erfahrung?</p>
<blockquote>
<p>Wozu sollte man also jeder Zuweisung den Overhead der Abfrage aufzwingen, wenn das praktisch nutzlos ist? Eine Abfrage macht nur dann Sinn und sollte auch nur dann verwendet werden, wenn sich sonst logische Fehler ergeben. Und selbst bei dynamischen Objekten ist die Abfrgae auf Selbstzuweisung nicht zwangsläufig notwendig.</p>
</blockquote>
<p>Gut gut, aber ist es nicht schwachsinnig, ein Objekt sich selbst zuzuweisen (nehmen wir mal an, es passiert doch), das kostet doch ebenfalls Performance. Oder spielst du darauf an, dass dieses eine mal weniger teuer ist, als n - mal die Abfrage?</p>
<p>EDIT: Ja, genau darauf wolltest du wohl hinaus, hab grad mal bei Marshall Cline reingeschaut, er hat's ganz gut drinstehen. Tja, die Runde geht an dich. Wieder was gelernt...</p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1010619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1010619</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Tue, 07 Mar 2006 19:34:24 GMT</pubDate></item></channel></rss>