<?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[Callback-Funktion an Template-Klasse]]></title><description><![CDATA[<p>Ich habe hier ein etwas älteres Projekt mit Strukturen, die hauptsächlich als verketteten Listen verwendet werden. Nun möchte ich mir das Leben etwas einfacher machen und hab mir einen Smart-Pointer-Wrapper dazu geschrieben. Das funktioniert auch sehr gut, nur möchte ich das Ganze nun etwas abstrakter machen. Mein Smart-Pointer funktioniert momentan nur für exakt einen Typ dieser Strukturen und das möchte ich mit Templates verallgemeinern.</p>
<p>Geben sind beispielsweise zwei structs:</p>
<pre><code class="language-cpp">struct A{
  int x1;
  int x2;
  A *next;
};

struct B{
  double x1;
  double x2;
  B *next;
};
</code></pre>
<p>Zu diesen beiden Klassen existieren jeweils eigene Funktionen, die eine verkettete Liste aus diesen Typen freigeben. Beispiel:</p>
<pre><code class="language-cpp">FreeLinkedA(A **pStart);
FreeLinkedB(B **pStart);
</code></pre>
<p>Mein Konstrukt sieht momentan so aus:</p>
<pre><code class="language-cpp">template &lt;class T, void (*freefnct)(T *param), int (*countfnct)(const T param), bool (*appendfnct)(T *source, T *append)&gt;
class AxSmartPointer{
protected:
	T m_value;

public:
	AxSmartPointer() : m_value(NULL) {
	}

	AxSmartPointer(T value) : m_value(value){
	}

	~AxSmartPointer(){
		Clear();
	}

public:
	T operator -&gt;(){
		return m_value;
	}

	void operator = (T value){
		Clear();
		m_value = value;
	}

	void operator += (T value){
		if(IsNULL())
			m_value = value;
		else
			appendfnct(&amp;m_value, &amp;value);
	}

	int Count() const {
		if(IsNULL())
			return 0;
		return countfnct(m_value);
	}

	bool IsNULL() const {
		return m_value == NULL;
	}

	void Clear(){
		if(!IsNULL())
			freefnct(&amp;m_value);
		m_value = NULL;
	}

	operator T(){
		return m_value;
	}

private:
	AxSmartPointer(const AxSmartPointer &amp;rhs);
};
</code></pre>
<p>Von diesem template hab ich mir eine Klasse erzeugt:</p>
<pre><code class="language-cpp">class StructAPtr : public AxSmartPointer&lt;A*, 
	FreeLinkedA, 
	CountLinkedA,
	AppendLinkedA&gt;{

};
</code></pre>
<p>Wenn ich nun den Smart-Pointer verwenden will, zum Beispiel hier:</p>
<pre><code class="language-cpp">StructAPtr myA(FunctionWhichReturnsLinkedA());
</code></pre>
<p>Bekomme ich folgende Fehlermeldung:<br />
error C2664: 'StructAPtr::StructAPtr(const StructAPtr &amp;)' : cannot convert parameter 1 from 'A *' to 'const StructAPtr &amp;'</p>
<p>Irgendwas mach ich also falsch. Kann mir jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/276237/callback-funktion-an-template-klasse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 10:18:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276237.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 29 Oct 2010 12:06:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Callback-Funktion an Template-Klasse on Fri, 29 Oct 2010 12:06:38 GMT]]></title><description><![CDATA[<p>Ich habe hier ein etwas älteres Projekt mit Strukturen, die hauptsächlich als verketteten Listen verwendet werden. Nun möchte ich mir das Leben etwas einfacher machen und hab mir einen Smart-Pointer-Wrapper dazu geschrieben. Das funktioniert auch sehr gut, nur möchte ich das Ganze nun etwas abstrakter machen. Mein Smart-Pointer funktioniert momentan nur für exakt einen Typ dieser Strukturen und das möchte ich mit Templates verallgemeinern.</p>
<p>Geben sind beispielsweise zwei structs:</p>
<pre><code class="language-cpp">struct A{
  int x1;
  int x2;
  A *next;
};

struct B{
  double x1;
  double x2;
  B *next;
};
</code></pre>
<p>Zu diesen beiden Klassen existieren jeweils eigene Funktionen, die eine verkettete Liste aus diesen Typen freigeben. Beispiel:</p>
<pre><code class="language-cpp">FreeLinkedA(A **pStart);
FreeLinkedB(B **pStart);
</code></pre>
<p>Mein Konstrukt sieht momentan so aus:</p>
<pre><code class="language-cpp">template &lt;class T, void (*freefnct)(T *param), int (*countfnct)(const T param), bool (*appendfnct)(T *source, T *append)&gt;
class AxSmartPointer{
protected:
	T m_value;

public:
	AxSmartPointer() : m_value(NULL) {
	}

	AxSmartPointer(T value) : m_value(value){
	}

	~AxSmartPointer(){
		Clear();
	}

public:
	T operator -&gt;(){
		return m_value;
	}

	void operator = (T value){
		Clear();
		m_value = value;
	}

	void operator += (T value){
		if(IsNULL())
			m_value = value;
		else
			appendfnct(&amp;m_value, &amp;value);
	}

	int Count() const {
		if(IsNULL())
			return 0;
		return countfnct(m_value);
	}

	bool IsNULL() const {
		return m_value == NULL;
	}

	void Clear(){
		if(!IsNULL())
			freefnct(&amp;m_value);
		m_value = NULL;
	}

	operator T(){
		return m_value;
	}

private:
	AxSmartPointer(const AxSmartPointer &amp;rhs);
};
</code></pre>
<p>Von diesem template hab ich mir eine Klasse erzeugt:</p>
<pre><code class="language-cpp">class StructAPtr : public AxSmartPointer&lt;A*, 
	FreeLinkedA, 
	CountLinkedA,
	AppendLinkedA&gt;{

};
</code></pre>
<p>Wenn ich nun den Smart-Pointer verwenden will, zum Beispiel hier:</p>
<pre><code class="language-cpp">StructAPtr myA(FunctionWhichReturnsLinkedA());
</code></pre>
<p>Bekomme ich folgende Fehlermeldung:<br />
error C2664: 'StructAPtr::StructAPtr(const StructAPtr &amp;)' : cannot convert parameter 1 from 'A *' to 'const StructAPtr &amp;'</p>
<p>Irgendwas mach ich also falsch. Kann mir jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972317</guid><dc:creator><![CDATA[Source2702]]></dc:creator><pubDate>Fri, 29 Oct 2010 12:06:38 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion an Template-Klasse on Fri, 29 Oct 2010 12:30:03 GMT]]></title><description><![CDATA[<p>Spricht irgendetwas dagegen, std::list und TR1::shared_ptr zu benutzen? Oder einen Pointer Container aus den boost Bibliotheken?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972327</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 29 Oct 2010 12:30:03 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion an Template-Klasse on Fri, 29 Oct 2010 12:34:16 GMT]]></title><description><![CDATA[<p>Wenn du mit std::list meinst, dass ich die verketteten Liste dadurch ersetzen soll, dann spricht der Aufwand dagegen. Das Projekt ist sehr groß und hunderte Funktionen erwarten die verkette Liste als Parameter.<br />
Gegen die Verwendung von TR1 spricht, dass ich die Entwicklungsumgebungen von VS 2002 - 2008 unterstützen muss.</p>
<p>Ich hab ja im Prinzip nur ein Problem mit dem template. Mein erster Smart-Pointer Ansatz hat ja gut funktioniert, aber eben nur für einen Typ.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972330</guid><dc:creator><![CDATA[Source2702]]></dc:creator><pubDate>Fri, 29 Oct 2010 12:34:16 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion an Template-Klasse on Fri, 29 Oct 2010 13:32:03 GMT]]></title><description><![CDATA[<p>Source2702 schrieb:</p>
<blockquote>
<p>Bekomme ich folgende Fehlermeldung:<br />
error C2664: 'StructAPtr::StructAPtr(const StructAPtr &amp;)' : cannot convert parameter 1 from 'A *' to 'const StructAPtr &amp;'</p>
<p>Irgendwas mach ich also falsch. Kann mir jemand helfen?</p>
</blockquote>
<p>Es existiert kein Konstructor der ein A* nimmt.<br />
Ich glaube jetzt kannst du das Problem lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972340</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Fri, 29 Oct 2010 13:32:03 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion an Template-Klasse on Tue, 02 Nov 2010 08:27:08 GMT]]></title><description><![CDATA[<p>Der Konstruktor, der ein A* nimmt ist doch im template implementiert:</p>
<pre><code class="language-cpp">AxSmartPointer(T value) : m_value(value){
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1973941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973941</guid><dc:creator><![CDATA[Source2702]]></dc:creator><pubDate>Tue, 02 Nov 2010 08:27:08 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion an Template-Klasse on Tue, 02 Nov 2010 12:18:02 GMT]]></title><description><![CDATA[<p>Source2702 schrieb:</p>
<blockquote>
<p>Der Konstruktor, der ein A* nimmt ist doch im template implementiert:</p>
<pre><code class="language-cpp">AxSmartPointer(T value) : m_value(value){
}
</code></pre>
</blockquote>
<p>Den erbt dein StructAPtr aber nicht. Also ist er für StructAPtr eben NICHT implementiert. Der Compiler kennt für StructAPtr nur die compilergenerierten Konstruktoren (Default- und Copy-Ctor).</p>
<p>mach stattdessen ein <code>typedef AxSmartPointer&lt;A*, FreeLinkedA, CountLinkedA, AppendLinkedA&gt; StrustAPtr;</code> dann hast du auch die Ctoren des Templates.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974050</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 02 Nov 2010 12:18:02 GMT</pubDate></item></channel></rss>