<?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[operator[] bei Templates]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte nen Array schreiben, allerdings funktioniert das nicht so wie erhofft.</p>
<p>Wie kriege ich es hin, dass ich mit dem operator[] Elemente ersetzen kann?</p>
<p>Was muss ich als return Type haben?<br />
type* und type&amp; klappt nicht?</p>
<p>Gruß,<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/129176/operator-bei-templates</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 06:06:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/129176.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 10 Dec 2005 22:42:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator[] bei Templates on Sat, 10 Dec 2005 22:42:52 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte nen Array schreiben, allerdings funktioniert das nicht so wie erhofft.</p>
<p>Wie kriege ich es hin, dass ich mit dem operator[] Elemente ersetzen kann?</p>
<p>Was muss ich als return Type haben?<br />
type* und type&amp; klappt nicht?</p>
<p>Gruß,<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939296</guid><dc:creator><![CDATA[KeviKo]]></dc:creator><pubDate>Sat, 10 Dec 2005 22:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sat, 10 Dec 2005 22:47:04 GMT]]></title><description><![CDATA[<p>doch, type&amp; ist korrekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939297</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 10 Dec 2005 22:47:04 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sat, 10 Dec 2005 22:56:37 GMT]]></title><description><![CDATA[<p>du wahrscheinlich noch<br />
const type&amp; operator[] (size_t index) const {...}</p>
<p>Also ich meine: Die const-Version brauchst du nicht um Werte zu überhschreiben, aber die gehört auch dazu.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939300</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Sat, 10 Dec 2005 22:56:37 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sat, 10 Dec 2005 23:04:48 GMT]]></title><description><![CDATA[<p>Danke schonmal...</p>
<p>Das funktioniert...<br />
Allerdings nicht mit Referenzen...<br />
Warum nicht?</p>
<p>Gruß,<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939307</guid><dc:creator><![CDATA[KeviKo]]></dc:creator><pubDate>Sat, 10 Dec 2005 23:04:48 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sat, 10 Dec 2005 23:05:28 GMT]]></title><description><![CDATA[<p>KeviKo schrieb:</p>
<blockquote>
<p>Danke schonmal...</p>
<p>Das funktioniert...<br />
Allerdings nicht mit Referenzen...<br />
Warum nicht?</p>
<p>Gruß,<br />
Kevin</p>
</blockquote>
<p>Was konkret funktioniert denn nicht? Fehlermeldung? Zeig mal was Code.</p>
<p>mfg<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939308</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Sat, 10 Dec 2005 23:05:28 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sat, 10 Dec 2005 23:37:42 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;class type&gt;
class TTemplate {

public:
	TTemplate(type t){
		this-&gt;t = t;	
	}
	virtual ~TTemplate(){}

	type&amp; operator[](unsigned int i){
		return t;
	}

private:
	type t;

};
</code></pre>
<pre><code class="language-cpp">TObject&amp; o = TObject();
	TTemplate&lt;TObject&amp;&gt;* list = new TTemplate&lt;TObject&amp;&gt;(thr);
	threadlist[0] = thr;
</code></pre>
<p>Ich hab das mal stark vereinfacht:</p>
<p>Fehlermeldung:<br />
instantiation of non-const reference type 'class TObject&amp;' from rvalue of type 'TObject'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939319</guid><dc:creator><![CDATA[KeviKo]]></dc:creator><pubDate>Sat, 10 Dec 2005 23:37:42 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sat, 10 Dec 2005 23:40:56 GMT]]></title><description><![CDATA[<p>dazu brauchste den const type&amp; operator[] (size_t index) const {...} von FireFlow</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939320</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 10 Dec 2005 23:40:56 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sat, 10 Dec 2005 23:57:51 GMT]]></title><description><![CDATA[<p>Verseh ich nicht so ganz, was ihr meint...</p>
<p>so:</p>
<pre><code class="language-cpp">const type&amp; operator[] (unsigned int i) const {
		return t;
	}
</code></pre>
<p>????</p>
<p>Immernoch der gleiche Fehler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939326</guid><dc:creator><![CDATA[KeviKo]]></dc:creator><pubDate>Sat, 10 Dec 2005 23:57:51 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sun, 11 Dec 2005 00:13:36 GMT]]></title><description><![CDATA[<p>kann deinem code eh nicht folgen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939332</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 11 Dec 2005 00:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sun, 11 Dec 2005 00:16:57 GMT]]></title><description><![CDATA[<p>Referenzen kann man nicht in Containern speichern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939335</guid><dc:creator><![CDATA[unmöglich]]></dc:creator><pubDate>Sun, 11 Dec 2005 00:16:57 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sun, 11 Dec 2005 00:32:09 GMT]]></title><description><![CDATA[<p>unmöglich schrieb:</p>
<blockquote>
<p>Referenzen kann man nicht in Containern speichern.</p>
</blockquote>
<p>nicht in arrays. und das macht er nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939347</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 11 Dec 2005 00:32:09 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sun, 11 Dec 2005 07:50:57 GMT]]></title><description><![CDATA[<p>KeviKo schrieb:</p>
<blockquote>
<pre><code class="language-cpp">TObject&amp; o = TObject();
</code></pre>
</blockquote>
<p>TObject() ist ein temporäres Objekt, solche kannst du aber nicht an non-const Referenzen binden, sondern nur an const Referenzen. Folgendes würde also funktionieren:</p>
<pre><code class="language-cpp">const TObject&amp; o = TObject();
</code></pre>
<p>Das Problem bei der non-const Version ist, dass dort direkt ein Objekt, also unser temporäres Objekt, an die Referenz gebunden werden würde. Das temporäre Objekt wird aber sofort wieder zerstört, sobald seine Verwendung als rvalue erlischt. Dh, du hättest danach eine Referenz auf ein nicht mehr existierendes Objekt. Macht also keinen Sinn. Bei der const Version hingegen kann der Compiler bei Bedarf selbst ein temporäres Objekt erzeugen, also in unserem Fall ein zweites temporäres Objekt, welches mit dem temporären Objekt des Client initialisiert wird. Dass dieses temporäre Client Objekt danach zerstört wird, spielt also keine Rolle mehr, da der Compiler ja selbst noch ein solches besitzt. Und das kann er solange halten und referenzieren, bis die Referenz nicht mehr gebraucht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939388</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sun, 11 Dec 2005 07:50:57 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Sun, 11 Dec 2005 12:12:49 GMT]]></title><description><![CDATA[<p>Ah...<br />
Liegt an der Lebensdauer des Objektes<br />
Eigentlich logisch.</p>
<p>Was ich aber absolut nicht verstehe:<br />
Ich nehmen jetzt als Typ TObject*.<br />
Ich hab den Konstruktor jetzt so geändert, dass er einen int übergeben kriegt.<br />
Jetzt macht er bei der Zuweisung</p>
<pre><code class="language-cpp">templ[0] = new TObject();
</code></pre>
<p>den Fehler:<br />
parse error before ')' token<br />
Invalid conversion from 'TObject*' to 'int'</p>
<p>Was hat der Konstruktor damit zu tun?</p>
<p>Vielen Dank,<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939496</guid><dc:creator><![CDATA[KeviKo]]></dc:creator><pubDate>Sun, 11 Dec 2005 12:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Mon, 12 Dec 2005 07:33:19 GMT]]></title><description><![CDATA[<p>Von welchem Typ ist denn 'temp1'? Und ich kann dir nicht folgen, was du mit</p>
<blockquote>
<p>Ich hab den Konstruktor jetzt so geändert, dass er einen int übergeben kriegt.</p>
</blockquote>
<p>meinst bzw. bezwecken willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/939965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/939965</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 12 Dec 2005 07:33:19 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Tue, 13 Dec 2005 08:53:01 GMT]]></title><description><![CDATA[<p>Der code müßte doch eigentlich kompilierfähig sein...<br />
Dass t beim returnen undefieniert ist, ist mir klar...</p>
<pre><code class="language-cpp">template&lt;class type&gt;
class TTemplate {

public:
    TTemplate(/*type t*/ int i){
    }
    virtual ~TTemplate(){}

    type&amp; operator[](unsigned int i){
        return t;
    }

private:
    type t;

};
</code></pre>
<p>Inzwischen bin ich davon überzeugt, dass es ein Compiler-Problem ist,<br />
denn unter Linux kompiliert er es...<br />
Ich verwende MinGW unter XP.</p>
<p>Gruß,<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940790</guid><dc:creator><![CDATA[KeviKo]]></dc:creator><pubDate>Tue, 13 Dec 2005 08:53:01 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Tue, 13 Dec 2005 17:50:05 GMT]]></title><description><![CDATA[<p>KeviKo schrieb:</p>
<blockquote>
<p>Der code müßte doch eigentlich kompilierfähig sein...</p>
</blockquote>
<p>Schön möglich, bevor du aber meine Frage nicht beantwortest, kann ich dir das nicht beantworten.</p>
<pre><code class="language-cpp">new TObject()
</code></pre>
<p>gibt jedenfalls ein TObject* zurück, also muss</p>
<pre><code class="language-cpp">templ[0]
</code></pre>
<p>einen entsprechenden Zuweisungsoperator besitzen. Falls nicht, wird versucht, einen passenden Konstruktor zu finden.<br />
Ich kann dir zwar relativ schlecht folgen, aber vermutlich brauchst do sowas:</p>
<pre><code class="language-cpp">TTemplate(type* t)
</code></pre>
<p>Mir ist aber immer noch unklar, wieso du plötzlich die Sache mit new lösen willst. Ich hoffe du vergisst nach Gebrauch das delete nicht. <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="😉"
    /><br />
:xmas1: :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941269</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 13 Dec 2005 17:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Tue, 13 Dec 2005 20:24:23 GMT]]></title><description><![CDATA[<p>temp1 ist vom Typ TObject*.<br />
Ich habs ja mit new TObject() erzeugt.<br />
Kann doch dann nix anderes sein, oder?<br />
(Es sei denn ich mach irgendwann nen * davor)</p>
<p>Das soll nen Array-Template werden.<br />
Deshalb auch der int Parameter.</p>
<p>Dass ich mich um die Garbage-Collection<br />
kümmern muss, ist mir klar...</p>
<p>Aber wieso brauch ich sowas?</p>
<pre><code class="language-cpp">TTemplate(type* t)
</code></pre>
<p>Gruß,<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941433</guid><dc:creator><![CDATA[KeviKo]]></dc:creator><pubDate>Tue, 13 Dec 2005 20:24:23 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Wed, 14 Dec 2005 08:36:58 GMT]]></title><description><![CDATA[<p>KeviKo schrieb:</p>
<blockquote>
<p>temp1 ist vom Typ TObject*.<br />
Ich habs ja mit new TObject() erzeugt.<br />
Kann doch dann nix anderes sein, oder?</p>
</blockquote>
<p>Es geht nicht darum, was du temp1 zuweist, interessant ist erstmal nur, wie temp1 deklariert ist.</p>
<p>KeviKo schrieb:</p>
<blockquote>
<p>Das soll nen Array-Template werden.<br />
Deshalb auch der int Parameter.</p>
</blockquote>
<p>Und der int Parameter gibt die initiale Grösse an, oder? Dann mach den ctor aber <em>explicit</em>, damit keine implizite Umwandlung durchgeführt wird.</p>
<p>KeviKo schrieb:</p>
<blockquote>
<p>Aber wieso brauch ich sowas?</p>
<pre><code class="language-cpp">TTemplate(type* t)
</code></pre>
<p>Gruß,<br />
Kevin</p>
</blockquote>
<p>Wenn du die Werte nicht direkt im Container speicherst, sondern lediglich Zeiger auf die Werte, dann brauchst du einen entsprechenden ctor bzw. Zuweisungsoperator. Dh jetzt nicht, dass du den ctor exakt so deklarieren sollst. Der Code ist ja mehr oder weniger nur Pseudo. Du kannst auch type so angeben, dass es ein Zeiger ist. So wie man es idR von anderen Containern kennt, zB std::vector. Da in deinem Originalcode aber kein Zeiger für type verwendet wurde (TTemplate&lt;TObject&amp;&gt;), kam mir der ctor</p>
<pre><code class="language-cpp">TTemplate(/*type t*/ int i){
    }
</code></pre>
<p>etwas seltsam vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941656</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 14 Dec 2005 08:36:58 GMT</pubDate></item><item><title><![CDATA[Reply to operator[] bei Templates on Wed, 14 Dec 2005 08:54:46 GMT]]></title><description><![CDATA[<p>KeviKo schrieb:</p>
<blockquote>
<p>temp1 ist vom Typ TObject*.<br />
Ich habs ja mit new TObject() erzeugt.<br />
Kann doch dann nix anderes sein, oder?</p>
</blockquote>
<p>Es geht nicht darum, was du temp1 zuweist, interessant ist erstmal nur, wie temp1 deklariert ist. Oder ist temp1 tatsächlich vom Typ TObject*? Dann kann das nicht funktionieren, da temp1[0] dann vom Typ TObject ist.</p>
<p>KeviKo schrieb:</p>
<blockquote>
<p>Das soll nen Array-Template werden.<br />
Deshalb auch der int Parameter.</p>
</blockquote>
<p>Und der int Parameter gibt die initiale Grösse an, oder? Dann mach den ctor aber <em>explicit</em>, damit keine implizite Umwandlung durchgeführt wird.</p>
<p>KeviKo schrieb:</p>
<blockquote>
<p>Aber wieso brauch ich sowas?</p>
<pre><code class="language-cpp">TTemplate(type* t)
</code></pre>
<p>Gruß,<br />
Kevin</p>
</blockquote>
<p>Brauchen musst du das natürlich nicht. Wenn du die Werte nicht direkt im Container speicherst, sondern lediglich Zeiger auf die Werte, dann muss type entsprechend spezifiziert sein. Dh jetzt nicht, dass du den ctor exakt so deklarieren sollst. Der Code ist ja mehr oder weniger nur Pseudo. Wenn ich es mir so überlege, macht ein solcher ctor sowieso nur in wenigen Fällen Sinn. ZB dann, wenn du bei der Instanzierung ein initiales Element angeben willst. Wenn Zeiger in den Container gespeichert werden sollen, dann ist es jedenfalls generell besser, wenn type entsprechend als Zeiger angegeben wurde. Da in deinem Originalcode aber kein Zeiger für type verwendet wurde (TTemplate&lt;TObject&amp;&gt;), kam mir der ctor</p>
<pre><code class="language-cpp">TTemplate(/*type t*/ int i){
    }
</code></pre>
<p>halt etwas seltsam vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941663</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 14 Dec 2005 08:54:46 GMT</pubDate></item></channel></rss>