<?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 Funktionsaufruf- Interface]]></title><description><![CDATA[<p>Hallo,</p>
<p>soweit bin ich bisher:</p>
<pre><code class="language-cpp">template&lt;class T&gt; 
static T GetValue(int x, string name, T value)
{
    T t = T();
    t.Parse(name);
    return t;
}
</code></pre>
<p>Der Compiler spuckt aus:</p>
<blockquote>
<p>error C2228: Links von &quot;.Parse&quot; muss sich eine Klasse/Struktur/Union befinden.</p>
</blockquote>
<p>Die Methode Parse habe ich abstrakt in einem &quot;Interface&quot; abgelegt. Die GetValue- Funktion wird nur von Klassen benutzt, die aus diesem Interface erben. Wo liegt aber der Fehler?</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282176/template-funktionsaufruf-interface</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 08:56:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282176.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Feb 2011 13:13:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Tue, 15 Feb 2011 13:13:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>soweit bin ich bisher:</p>
<pre><code class="language-cpp">template&lt;class T&gt; 
static T GetValue(int x, string name, T value)
{
    T t = T();
    t.Parse(name);
    return t;
}
</code></pre>
<p>Der Compiler spuckt aus:</p>
<blockquote>
<p>error C2228: Links von &quot;.Parse&quot; muss sich eine Klasse/Struktur/Union befinden.</p>
</blockquote>
<p>Die Methode Parse habe ich abstrakt in einem &quot;Interface&quot; abgelegt. Die GetValue- Funktion wird nur von Klassen benutzt, die aus diesem Interface erben. Wo liegt aber der Fehler?</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021260</guid><dc:creator><![CDATA[neu_hier]]></dc:creator><pubDate>Tue, 15 Feb 2011 13:13:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Tue, 15 Feb 2011 13:20:47 GMT]]></title><description><![CDATA[<p>Bitte ein komplettes Beispiel angeben, das den Fehler beinhaltet.</p>
<p>Ich kann Folgendes problemlos kompilieren:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
static T GetValue(int x, string name, T value)
{
    T t = T();
    t.Parse(name);
    return t;
}

struct Abstract
{
	virtual void Parse(string) = 0;
};

struct Concrete
{
	virtual void Parse(string) {}
};

int main()
{
	GetValue(42, &quot;foobar&quot;, Concrete());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2021262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021262</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 15 Feb 2011 13:20:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Tue, 15 Feb 2011 13:51:38 GMT]]></title><description><![CDATA[<p>Bei mir schaut es ähnlich aus, der Fehler ist aber trotzdem da:</p>
<pre><code class="language-cpp">class inter
{
public:
    virtual bool Parse(string text)=0;
};

class Concrete : public inter
{
public:
    virtual bool Parse(string input)
    {
        return false;
    }
};

int main
{
    GetValue(42, &quot;foobar&quot;, Concrete());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2021278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021278</guid><dc:creator><![CDATA[neu_hier]]></dc:creator><pubDate>Tue, 15 Feb 2011 13:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Tue, 15 Feb 2011 14:02:56 GMT]]></title><description><![CDATA[<p>Kompiliert bei mir.</p>
<p>Kopiere die komplette Datei hierhin, die den Fehler verursacht. Nenne außerdem deine Compiler-Version.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021290</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 15 Feb 2011 14:02:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Tue, 15 Feb 2011 14:23:54 GMT]]></title><description><![CDATA[<p>Was meinst du mit komplette Datei?</p>
<p>Ich benutze Visual Studio 2008!</p>
<p>Kleine Unterschiede habe ich noch, die ich nicht für wichtig erachtet habe:<br />
- Ich rufe GetValue nicht über die Main auf, sondern innerhalb einer Methode einer ganz anderen Klasse</p>
<p>- Concrete erbt nicht direkt aus inter, sondern es gibt noch eine Klasse, die dazwischen liegt:</p>
<pre><code class="language-cpp">class HalbConcrete : public inter
{
};

class Concrete : public HalbConcrete 
{
public:
    virtual bool Parse(string input)
    {
        return false;
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2021302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021302</guid><dc:creator><![CDATA[neu_hier]]></dc:creator><pubDate>Tue, 15 Feb 2011 14:23:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Tue, 15 Feb 2011 14:28:16 GMT]]></title><description><![CDATA[<p>neu_hier schrieb:</p>
<blockquote>
<p>Kleine Unterschiede habe ich noch, die ich nicht für wichtig erachtet habe</p>
</blockquote>
<p>Du solltest prüfen, ob der Code ohne die &quot;kleinen Unterschiede&quot; noch dasselbe Fehlverhalten zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021306</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Tue, 15 Feb 2011 14:28:16 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Tue, 15 Feb 2011 14:31:26 GMT]]></title><description><![CDATA[<p>neu_hier schrieb:</p>
<blockquote>
<p>Was meinst du mit komplette Datei?</p>
</blockquote>
<p>Du lässt die relevanten Informationen weg, denn das, was du bisher gezeigt hast, lässt sich problemlos mit VS 2008 kompilieren. Deshalb empfehle ich dir folgendes Vorgehen:</p>
<p>Erstelle ein Testprojekt (bzw. du hast wie ich ein Testprojekt, in dem du immer wieder kleine Codestücke z. B. aus dem Forum ausprobieren kannst). Kopiere die relevanten Dateien aus dem Originalprojekt in das Testprojekt. Entferne solange irrelevanten Code wie sich die Fehlermeldungen nicht ändern. Wenn du durch diese Vorgehensweise den Fehler noch nicht selbst gefunden hast, kanst du im Forum den Code posten, der im Testprojekt übrigbleibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021308</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 15 Feb 2011 14:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Wed, 16 Feb 2011 06:56:19 GMT]]></title><description><![CDATA[<p>Ich habe du vermutlich relevante Information gefunden:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
static T GetValue(TiXmlElement* x, string name, T value)
{
    T t = T();
    t.Parsetest(name);
    return t;
}
</code></pre>
<p>Ich benutze TinyXml und übergebe eine &quot;TiXmlElement&quot; in dem GetValue. Sobald ich aber einen &quot;int&quot; stattdessen übergebe, verschwindet der Fehler...<br />
Wie der Zufall so will enthält TinyXml ebenfalls eine Methode &quot;Parse&quot;, also habe ich die im Interface benutzte Methode zu Parsetest geändert. Leider ohne Ergebnis. Der Fehler besteht weiterhin.</p>
<p>Danach habe ich einfach mal einen Pointer zu dem TiXmlElement übergeben -&gt; der Fehler verschwindet! Aber warum? An anderer Stelle übergebe ich erfolgreich ein TiXmlElement (u.a. auch in eine template Klasse). Nun befürchte ich, dass mich der Fehler irgendwann heimsuchen wird. Und mit irgendwann meine ich den Zeitpunkt, an dem ich dieses Problem völlig vergessen habe und keine Ahnung habe woher es kommt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021651</guid><dc:creator><![CDATA[neu_hier]]></dc:creator><pubDate>Wed, 16 Feb 2011 06:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Wed, 16 Feb 2011 09:40:30 GMT]]></title><description><![CDATA[<p>neu_hier schrieb:</p>
<blockquote>
<p>Ich benutze TinyXml und übergebe eine &quot;TiXmlElement&quot; in dem GetValue.</p>
</blockquote>
<p>Für x oder value?</p>
<p>neu_hier schrieb:</p>
<blockquote>
<p>Danach habe ich einfach mal einen Pointer zu dem TiXmlElement übergeben</p>
</blockquote>
<p>Für x oder value?</p>
<p>Den Parameter x benutzt deine Beispielfunktion gar nicht. Das Verhalten hängt vom Typ von value ab. Zu dem hast du aber bisher nichts gesagt.</p>
<p>Zeig doch bitte endlich mal den Aufruf, oder ein vollständiges Beispielprogramm, das den Fehler reproduziert. Dein Beispielcode und deine Erklärungen sind absolut unzureichend für eine Diagnose.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021691</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 16 Feb 2011 09:40:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Wed, 16 Feb 2011 10:00:51 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Für x oder value?</p>
</blockquote>
<p>In beiden Fällen für x</p>
<p>MFK schrieb:</p>
<blockquote>
<p>Den Parameter x benutzt deine Beispielfunktion gar nicht.</p>
</blockquote>
<p>Das macht es eben um so lustiger! Ich benutze den Parameter x nicht (habe ich testweise ausgeklammert) und trotzdem werden Fehler ausgespuckt, wenn der Parameter x kein Pointer ist!</p>
<p>Ich fasse am Besten nochmal die Programmschnippsel zusammen, auf die ich das ganze runtergebrochen habe:</p>
<pre><code class="language-cpp">class inter
{
public:
    virtual bool Parse(string text)=0;
};

class HalbConcrete : public inter
{
public:
    virtual bool Parse(string input)
    {
        return false;
    }
};

class Concrete : public HalbConcrete
{
};

int main(TiXmlElement elem)
{
    if (&amp;elem == NULL)
    {
        return 0;
    }
    GetValue(&amp;elem, &quot;foobar&quot;, Concrete()); // je nach template (siehe unten)
    //GetValue(elem, &quot;foobar&quot;, Concrete());
}
</code></pre>
<p>Mit diesem template läuft es:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
static T GetValue(TiXmlElement* x, string name, T value)
{
    T t = T();
    t.Parse(name);
    return t;
}
</code></pre>
<p>Mit diesem template nicht:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
static T GetValue(TiXmlElement x, string name, T value)
{
    T t = T();
    t.Parse(name);
    return t;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2021698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021698</guid><dc:creator><![CDATA[neu_hier]]></dc:creator><pubDate>Wed, 16 Feb 2011 10:00:51 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Wed, 16 Feb 2011 10:10:36 GMT]]></title><description><![CDATA[<p>neu_hier schrieb:</p>
<blockquote>
<p>Ich fasse am Besten nochmal die Programmschnippsel zusammen, auf die ich das ganze runtergebrochen habe:</p>
</blockquote>
<p>Das bringt <strong>überhaupt nichts</strong>, wenn du nicht prüfst, ob dein heruntergebrochenes Programmschnipsel dasselbe Fehlverhalten aufweist. <strong>Und das tut es nicht</strong>. Kommt das bei dir irgendwie nicht an?</p>
<p>Folgendes Programm kompiliert ohne Fehler:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

using namespace std;

class TiXmlElement
{
public:
	void Parse(string) {}
};

template&lt;class T&gt; 
static T GetValue(TiXmlElement x, string name, T value) 
{ 
	T t = T(); 
	t.Parse(name); 
	return t; 
}

class inter 
{ 
public: 
	virtual bool Parse(string text)=0; 
}; 

class HalbConcrete : public inter 
{ 
public: 
	virtual bool Parse(string input) 
	{ 
		return false; 
	} 
}; 

class Concrete : public HalbConcrete 
{ 
}; 

int main() 
{ 
	TiXmlElement elem;
	GetValue(elem, &quot;foobar&quot;, Concrete()); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2021703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021703</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 16 Feb 2011 10:10:36 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Wed, 16 Feb 2011 10:51:44 GMT]]></title><description><![CDATA[<p>Ich tippe darauf, daß es mit &quot;TiXmlElement&quot; im Originalcode nicht kompiliert, weil höchstwahrscheinlich beim Template-Code die Klasse nur als Vorwärtsreferenz bekannt gemacht wurde und nicht mittels &quot;include &lt;tinyxml.h&gt;&quot; bekannt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021720</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 16 Feb 2011 10:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Wed, 16 Feb 2011 12:05:56 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Das bringt <strong>überhaupt nichts</strong>, wenn du nicht prüfst, ob dein heruntergebrochenes Programmschnipsel dasselbe Fehlverhalten aufweist. <strong>Und das tut es nicht</strong>. Kommt das bei dir irgendwie nicht an?</p>
</blockquote>
<p>Ich habe mein Programm genau auf das heruntergebrochen, was ich gepostet habe und der Fehler tritt bei mir auf! Der einzige Unterschied zu deinem Programmcode ist nur, dass ich die Bibliotheken &quot;tinyxml.h&quot; und &quot;tinystr.h&quot; einbinde anstatt TiXmlElement zu definieren.</p>
<p>Th69 schrieb:</p>
<blockquote>
<p>Ich tippe darauf, daß es mit &quot;TiXmlElement&quot; im Originalcode nicht kompiliert, weil höchstwahrscheinlich beim Template-Code die Klasse nur als Vorwärtsreferenz bekannt gemacht wurde und nicht mittels &quot;include &lt;tinyxml.h&gt;&quot; bekannt ist.</p>
</blockquote>
<p>Ich hatte es als Vorwärtsreferenz bekannt gemacht. Nun habe ich aber die Bibliotheken eingebunden -&gt; gleicher Fehler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021741</guid><dc:creator><![CDATA[neu_hier]]></dc:creator><pubDate>Wed, 16 Feb 2011 12:05:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Wed, 16 Feb 2011 12:14:27 GMT]]></title><description><![CDATA[<p>neu_hier schrieb:</p>
<blockquote>
<p>Der einzige Unterschied zu deinem Programmcode ist nur, dass ich die Bibliotheken &quot;tinyxml.h&quot; und &quot;tinystr.h&quot; einbinde anstatt TiXmlElement zu definieren.</p>
</blockquote>
<p>Das kann ja schon mal nicht sein, weil mein Code mit dem echten TiXmlElement nicht funktioniert, da die Klasse keinen Defaultkonstruktor hat.</p>
<p>Aber dann eben so: Letzte Version von TinyXML runtergeladen, die betroffenen Header eingebunden:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &quot;tinystr.h&quot;
#include &quot;tinyxml.h&quot;

using namespace std;

template&lt;class T&gt; 
static T GetValue(TiXmlElement x, string name, T value) 
{ 
	T t = T(); 
	t.Parse(name); 
	return t; 
}

class inter 
{ 
public: 
	virtual bool Parse(string text)=0; 
}; 

class HalbConcrete : public inter 
{ 
public: 
	virtual bool Parse(string input) 
	{ 
		return false; 
	} 
}; 

class Concrete : public HalbConcrete 
{ 
}; 

int main() 
{ 
	TiXmlElement elem(&quot;foo&quot;);
	GetValue(elem, &quot;foobar&quot;, Concrete()); 
}
</code></pre>
<p>=&gt; Kompiliert, linkt natürlich nicht.</p>
<p>Bei dir nicht?<br />
Welcher Compiler?<br />
Welche TinyXML-Version ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021743</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 16 Feb 2011 12:14:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Wed, 16 Feb 2011 12:28:35 GMT]]></title><description><![CDATA[<p>Compiler ist Visual Studio 2008 SP1.</p>
<p>TinyXml Version 2.5.5!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021749</guid><dc:creator><![CDATA[neu_hier]]></dc:creator><pubDate>Wed, 16 Feb 2011 12:28:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionsaufruf- Interface on Wed, 16 Feb 2011 12:40:25 GMT]]></title><description><![CDATA[<p>neu_hier schrieb:</p>
<blockquote>
<p>TinyXml Version 2.5.5!</p>
</blockquote>
<p>Das ist die Versionnummer, die bei 2.6.1 (warum auch immer) in der changes.txt steht.</p>
<p>Ich hab's gerade mal mit Visual Studio 2008 SP1 probiert -&gt; Kompiliert.</p>
<p>Kannst du bitte mal ein neues Konsolenanwendungsprojekt anlegen, die Header und meinen Code reinkopieren und es ausprobieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021760</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 16 Feb 2011 12:40:25 GMT</pubDate></item></channel></rss>