<?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 Klasse in STL list]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe ein Problem. Ich möchte eine selbst geschriebene Template Klasse in eine STL list einfügen. Jedoch bekomme ich immer den Compilerungsfehler:</p>
<p>error C2664: 'std::list&lt;_Ty&gt;::push_back': Konvertierung des Parameters 1 von 'ref_ptr&lt;NodeTyp&gt;' in 'ref_ptr&lt;NodeTyp&gt; &amp;' nicht möglich</p>
<p>Hier der relevante Codeauschnitt:</p>
<pre><code>class MemoryManagementNode : public LCReferenced
{
	public:
		~MemoryManagementNode(){cout &lt;&lt; &quot;MemoryNode destroyed&quot; &lt;&lt; endl;};
};

list&lt;ref_ptr&lt;LCReferenced&gt;&gt; nodeList;
typedef list&lt;ref_ptr&lt;LCReferenced&gt;&gt;::iterator grIter;

................

int main(int argc, char ** argv)
{
	ref_ptr&lt;MemoryManagementNode&gt; node =  new MemoryManagementNode;
	node-&gt;print();
	nodeList.push_back(node);
.......
</code></pre>
<p>Die ref_ptr Template Klasse sieht folgendermaßen aus:</p>
<pre><code>#ifndef REF_PTR_H
#define REF_PTR_H

#include &quot;LCReferenced.h&quot;

using namespace std;

template &lt;typename NodeTyp&gt;
class __declspec(dllexport) ref_ptr
{
	//[---------------------------------------------------------------------------------------------]
	//[ Constructors																				]
	//[---------------------------------------------------------------------------------------------]
	public:
		ref_ptr(LCReferenced* nodePtr)
		{
			nodePointer = dynamic_cast&lt;NodeTyp *&gt;(nodePtr);
			if(nodePtr != NULL) 
			{
				nodePointer-&gt;ref();
			} else {
				cout &lt;&lt; &quot;Initialization failure!&quot; &lt;&lt; endl;
			}
		};

		ref_ptr():nodePointer(NULL){};

		virtual ~ref_ptr()
		{
			if(nodePointer != NULL) 
			{
				nodePointer-&gt;unref();
				nodePointer = NULL;
			}
		};
	//[---------------------------------------------------------------------------------------------]
	//[ Variables																					]
	//[---------------------------------------------------------------------------------------------]
	protected:
		NodeTyp* nodePointer;

	//[---------------------------------------------------------------------------------------------]
	//[ Functions																					]
	//[---------------------------------------------------------------------------------------------]
	public:
		NodeTyp* get() const{ return nodePointer; };

		bool valid() const
		{
			if(nodePointer) return true;
			return false;
		};

		NodeTyp &amp;operator=(const LCReferenced* nodePtr)
		{
			if(nodePtr != NULL) 
			{
				if(nodePointer) nodePointer-&gt;unref();
				nodePointer = nodePtr;
				nodePointer-&gt;ref();
			} else {
				cout &lt;&lt; &quot;Assignment faild!&quot; &lt;&lt; endl;
			}
			return *this;
		};

		NodeTyp &amp;operator=(const NodeTyp&amp; nodePtr)
		{
			if(nodePtr.get() != NULL) 
			{
				if(nodePointer) nodePointer-&gt;unref();
				nodePointer = nodePtr.get();
				nodePointer-&gt;ref();
			} else {
				cout &lt;&lt; &quot;Assignment faild!&quot; &lt;&lt; endl;
			}
			return *this;
		};

		NodeTyp* operator-&gt;() const { return nodePointer; };
		bool operator==(const NodeTyp&amp; nodePtr)	{ return (nodePointer == nodePtr.get()); };
		bool operator==(const LCReferenced* nodePtr){ return (nodePointer == nodePtr); };
};

#endif
</code></pre>
<p>Die LCReferenced Klasse besitzt folgendes Aussehen:</p>
<pre><code>class __declspec(dllexport) LCReferenced
{
	//[---------------------------------------------------------------------------------------------]
	//[ Constructors																				]
	//[---------------------------------------------------------------------------------------------]
	public:
		LCReferenced();
	protected:
		virtual ~LCReferenced();

	//[---------------------------------------------------------------------------------------------]
	//[ Variables																					]
	//[---------------------------------------------------------------------------------------------]
	public:

	protected:
		int refCounter;
	private:	

	//[---------------------------------------------------------------------------------------------]
	//[ Functions																					]
	//[---------------------------------------------------------------------------------------------]
	public:
		void ref();
		void unref();

	private:

	protected:

};
</code></pre>
<p>Hat jemand eine Idee?</p>
<p>Grüsse Nekoto</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200750/template-klasse-in-stl-list</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 02:33:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200750.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Dec 2007 12:13:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 12:13:07 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe ein Problem. Ich möchte eine selbst geschriebene Template Klasse in eine STL list einfügen. Jedoch bekomme ich immer den Compilerungsfehler:</p>
<p>error C2664: 'std::list&lt;_Ty&gt;::push_back': Konvertierung des Parameters 1 von 'ref_ptr&lt;NodeTyp&gt;' in 'ref_ptr&lt;NodeTyp&gt; &amp;' nicht möglich</p>
<p>Hier der relevante Codeauschnitt:</p>
<pre><code>class MemoryManagementNode : public LCReferenced
{
	public:
		~MemoryManagementNode(){cout &lt;&lt; &quot;MemoryNode destroyed&quot; &lt;&lt; endl;};
};

list&lt;ref_ptr&lt;LCReferenced&gt;&gt; nodeList;
typedef list&lt;ref_ptr&lt;LCReferenced&gt;&gt;::iterator grIter;

................

int main(int argc, char ** argv)
{
	ref_ptr&lt;MemoryManagementNode&gt; node =  new MemoryManagementNode;
	node-&gt;print();
	nodeList.push_back(node);
.......
</code></pre>
<p>Die ref_ptr Template Klasse sieht folgendermaßen aus:</p>
<pre><code>#ifndef REF_PTR_H
#define REF_PTR_H

#include &quot;LCReferenced.h&quot;

using namespace std;

template &lt;typename NodeTyp&gt;
class __declspec(dllexport) ref_ptr
{
	//[---------------------------------------------------------------------------------------------]
	//[ Constructors																				]
	//[---------------------------------------------------------------------------------------------]
	public:
		ref_ptr(LCReferenced* nodePtr)
		{
			nodePointer = dynamic_cast&lt;NodeTyp *&gt;(nodePtr);
			if(nodePtr != NULL) 
			{
				nodePointer-&gt;ref();
			} else {
				cout &lt;&lt; &quot;Initialization failure!&quot; &lt;&lt; endl;
			}
		};

		ref_ptr():nodePointer(NULL){};

		virtual ~ref_ptr()
		{
			if(nodePointer != NULL) 
			{
				nodePointer-&gt;unref();
				nodePointer = NULL;
			}
		};
	//[---------------------------------------------------------------------------------------------]
	//[ Variables																					]
	//[---------------------------------------------------------------------------------------------]
	protected:
		NodeTyp* nodePointer;

	//[---------------------------------------------------------------------------------------------]
	//[ Functions																					]
	//[---------------------------------------------------------------------------------------------]
	public:
		NodeTyp* get() const{ return nodePointer; };

		bool valid() const
		{
			if(nodePointer) return true;
			return false;
		};

		NodeTyp &amp;operator=(const LCReferenced* nodePtr)
		{
			if(nodePtr != NULL) 
			{
				if(nodePointer) nodePointer-&gt;unref();
				nodePointer = nodePtr;
				nodePointer-&gt;ref();
			} else {
				cout &lt;&lt; &quot;Assignment faild!&quot; &lt;&lt; endl;
			}
			return *this;
		};

		NodeTyp &amp;operator=(const NodeTyp&amp; nodePtr)
		{
			if(nodePtr.get() != NULL) 
			{
				if(nodePointer) nodePointer-&gt;unref();
				nodePointer = nodePtr.get();
				nodePointer-&gt;ref();
			} else {
				cout &lt;&lt; &quot;Assignment faild!&quot; &lt;&lt; endl;
			}
			return *this;
		};

		NodeTyp* operator-&gt;() const { return nodePointer; };
		bool operator==(const NodeTyp&amp; nodePtr)	{ return (nodePointer == nodePtr.get()); };
		bool operator==(const LCReferenced* nodePtr){ return (nodePointer == nodePtr); };
};

#endif
</code></pre>
<p>Die LCReferenced Klasse besitzt folgendes Aussehen:</p>
<pre><code>class __declspec(dllexport) LCReferenced
{
	//[---------------------------------------------------------------------------------------------]
	//[ Constructors																				]
	//[---------------------------------------------------------------------------------------------]
	public:
		LCReferenced();
	protected:
		virtual ~LCReferenced();

	//[---------------------------------------------------------------------------------------------]
	//[ Variables																					]
	//[---------------------------------------------------------------------------------------------]
	public:

	protected:
		int refCounter;
	private:	

	//[---------------------------------------------------------------------------------------------]
	//[ Functions																					]
	//[---------------------------------------------------------------------------------------------]
	public:
		void ref();
		void unref();

	private:

	protected:

};
</code></pre>
<p>Hat jemand eine Idee?</p>
<p>Grüsse Nekoto</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423119</guid><dc:creator><![CDATA[Nekoto]]></dc:creator><pubDate>Wed, 19 Dec 2007 12:13:07 GMT</pubDate></item><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 12:47:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">list&lt;ref_ptr&lt;LCReferenced&gt;&gt; nodeList;
typedef list&lt;ref_ptr&lt;LCReferenced&gt;&gt;::iterator grIter;
</code></pre>
<p>geht (noch) nicht, mach <code>list&lt;ref_ptr&lt;LCReferenced&gt; &gt;</code> , sonst wird es als rechts-shift interpretiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423123</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 19 Dec 2007 12:47:09 GMT</pubDate></item><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 12:20:41 GMT]]></title><description><![CDATA[<p>Du willst einen ref_ptr&lt;MemoryManagementNode&gt; in eine Liste von ref_ptr&lt;LCReferenced&gt; packen - selbst wenn die verzeigerten Klassen miteinander verwandt sind, sind die ref_ptr&lt;&gt; Instanziierungen unabhängig voneinander - und müssten zur Not manuell ineinander umgewandelt werden<sup>*</sup>.</p>
<p>Außerdem: Was bringt es denn, die Klasse als Template zu definieren, wenn du letztendlich doch nur LCReferenced-Abkömmlinge damit verwalten willst?</p>
<p><sup>*</sup> sprich: du benötigst einen Template-Copy-Ctor</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423124</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 19 Dec 2007 12:20:41 GMT</pubDate></item><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 12:38:07 GMT]]></title><description><![CDATA[<p>Die ref_ptr Template Klasse habe ich geschrieben um verschiedene Abkömmlinge von LCReferenced zu verwalten. Dabei wollte ich nicht immer ein downcast machen müssen um auf die jeweiligen Elementfunktionen der Kindklassen von LCReferenced zugreifen zu können. Prinzipiell realisert mir das ref_ptr Template eine Speicherverwaltung auf die Elemente die ich mit new ... dem entsprechenden ref_ptr Element zuweise.</p>
<p>Die STL list möchte ich zur Verwaltung der Kind-Elemente in einer Baumstruktur verwenden (Composite Pattern).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423141</guid><dc:creator><![CDATA[Nekoto]]></dc:creator><pubDate>Wed, 19 Dec 2007 12:38:07 GMT</pubDate></item><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 12:55:15 GMT]]></title><description><![CDATA[<p>Habe mal Deinen Rat befolgt CStoll und aus:</p>
<pre><code>list&lt;ref_ptr&lt;MemoryManagementNode&gt;&gt; nodeList;
typedef list&lt;ref_ptr&lt;MemoryManagementNode&gt;&gt;::iterator grIter;
</code></pre>
<p>gemacht. Jetzt gibt es keine Kompillierungsfehler mehr. Wenn ich aber nun folgendes versuche:</p>
<pre><code>grIter tempIter = find(nodeList.begin(), nodeList.end(), node);
</code></pre>
<p>kommt folgende Fehlermeldung:</p>
<p>algorithm(40) : error C2679: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'const ref_ptr&lt;NodeTyp&gt;' akzeptiert (oder keine geeignete Konvertierung möglich)</p>
<p>Hast Du dazu noch einen Vorschlag?</p>
<p>Grüsse Nekoto</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423160</guid><dc:creator><![CDATA[Nekoto]]></dc:creator><pubDate>Wed, 19 Dec 2007 12:55:15 GMT</pubDate></item><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 12:57:00 GMT]]></title><description><![CDATA[<p>Nekoto schrieb:</p>
<blockquote>
<p>Habe mal Deinen Rat befolgt CStoll und aus:</p>
<pre><code>list&lt;ref_ptr&lt;MemoryManagementNode&gt;&gt; nodeList;
typedef list&lt;ref_ptr&lt;MemoryManagementNode&gt;&gt;::iterator grIter;
</code></pre>
<p>gemacht. Jetzt gibt es keine Kompillierungsfehler mehr. Wenn ich aber nun folgendes versuche:</p>
<pre><code>grIter tempIter = find(nodeList.begin(), nodeList.end(), node);
</code></pre>
<p>kommt folgende Fehlermeldung:</p>
<p>algorithm(40) : error C2679: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'const ref_ptr&lt;NodeTyp&gt;' akzeptiert (oder keine geeignete Konvertierung möglich)</p>
<p>Hast Du dazu noch einen Vorschlag?</p>
<p>Grüsse Nekoto</p>
</blockquote>
<p>Ergänzung zur Fehlermeldung:</p>
<p>with<br />
[<br />
NodeTyp=MemoryManagementNode<br />
]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423165</guid><dc:creator><![CDATA[Nekoto]]></dc:creator><pubDate>Wed, 19 Dec 2007 12:57:00 GMT</pubDate></item><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 13:02:30 GMT]]></title><description><![CDATA[<p>Nunja, fuer find muss er die Elemente aus der Liste mit dem uebergebenen Argument (bei dir: node) vergleichen. Wenn du fuer den entsprechenden Typen (hier: ref_ptr&lt;MemoryManagementNode&gt;) keinen operator==() definiert hast ist das nicht moeglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423175</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 19 Dec 2007 13:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 13:09:59 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p><sup>*</sup> sprich: du benötigst einen Template-Copy-Ctor</p>
</blockquote>
<p>So etwas gibt es nicht. Allerdings fehlt dieser Klasse zusätzlich ein richtiger Copy-ctor. * und != sollten ebenfalls überladen werden. Zudem enthält der Construktor, der einen normalen Zeiger nimmt ein Speicherleck, falls der cast fehlschlägt. Der entsprechende Zuweisungsoperator dürfte überflüssig sein. Der Copy-Zuweisungsoperator genügt nicht den Assignable-Containervoraussetzungen der Standardbibliothek. Die Klasse dürfte für Verberung nicht geeignet sein - ein virtueller Destruktor ist daher unnötig und kostet nur unnötig Speicherplatz (und nutze private statt protected).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423183</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 19 Dec 2007 13:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 13:19:27 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Der Copy-Zuweisungsoperator genügt nicht den Assignable-Containervoraussetzungen der Standardbibliothek.</p>
</blockquote>
<p>Was meinst Du genau damit? Steh gerade auf dem Schlauch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423196</guid><dc:creator><![CDATA[Nekoto]]></dc:creator><pubDate>Wed, 19 Dec 2007 13:19:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 13:29:46 GMT]]></title><description><![CDATA[<pre><code>Table 64—Assignable requirements
expression      return type           post-condition
t = u           T&amp;                    t is equivalent to u
</code></pre>
<pre><code class="language-cpp">ref_ptr&lt;MemoryManagementNode&gt; node1 =  new MemoryManagementNode;
ref_ptr&lt;MemoryManagementNode&gt; node2;
node1 = node2;
assert( node1 == node2 ); // ups
</code></pre>
<p>und</p>
<pre><code class="language-cpp">ref_ptr&lt;MemoryManagementNode&gt; node =  new MemoryManagementNode;
node = node; // boom
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1423205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423205</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 19 Dec 2007 13:29:46 GMT</pubDate></item><item><title><![CDATA[Reply to Template Klasse in STL list on Wed, 19 Dec 2007 13:36:35 GMT]]></title><description><![CDATA[<p>@ camper Vielen Dank! Sehr gute Ausführung.</p>
<p>@ all: Vielen Dank für die schnellen und hilfreichen Antworten!</p>
<p>Grüsse Nekoto</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423222</guid><dc:creator><![CDATA[Nekoto]]></dc:creator><pubDate>Wed, 19 Dec 2007 13:36:35 GMT</pubDate></item></channel></rss>