<?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[Problem mit Template-Definition]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgenden Code der unter Linux in einer Lib laufen soll. Leider mache irgend etwas falsch.</p>
<pre><code class="language-cpp">#include &lt;string.h&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

#include &lt;rapidxml/rapidxml_print.hpp&gt;

using namespace rapidxml;

template&lt;class Ch = char&gt;
class CParseXML
{
private:
	char *ParseText;
	rapidxml::xml_document&lt;Ch&gt; m_doc; // character type defaults to char

public:
	CParseXML(const std::string&amp; File) : ParseText(NULL)
	{
		if (strlen(ParseText))
			Parse(ParseText);
	}

	long Parse (char *XmlString) {
		long RC = 0;
		try {
			m_doc.parse&lt;parse_default&gt;(XmlString);    // 0 means default parse flags
		}
		catch (rapidxml::parse_error&amp; ex) {
			std::cout &lt;&lt; ex.what();
			RC = -1;
		}

		return RC;
	}

	~CParseXML(void) {
		delete [] ParseText;
	};
};

long ParseLicence(const char *OutStream, const std::string&amp; SerialNumber) {
	CParseXML&lt;&gt; *pParseXML = new CParseXML&lt;&gt;(OutStream);
	if (!pParseXML) return -1;
}
</code></pre>
<p>nach:</p>
<pre><code>g++ test.cpp -I. -fPIC -c -Wall
</code></pre>
<p>bekomme ich folgendes:</p>
<pre><code>dan@dev-pc-dan-linux:~/src/test$ g++ test.cpp -I. -fPIC -c -Wall
test.cpp: In member function ‘long int CParseXML&lt;Ch&gt;::Parse(char*) [with Ch = char]’:
test.cpp:21:4:   instantiated from ‘CParseXML&lt;Ch&gt;::CParseXML(const std::string&amp;) [with Ch = char, std::string = std::basic_string&lt;char&gt;]’
test.cpp:43:52:   instantiated from here
test.cpp:27:4: error: invalid operands of types ‘&lt;unresolved overloaded function type&gt;’ and ‘const int’ to binary ‘operator&lt;’
test.cpp: In function ‘long int ParseLicence(const char*, const std::string&amp;)’:
test.cpp:45:1: warning: control reaches end of non-void function
dan@dev-pc-dan-linux:~/src/test$
</code></pre>
<p>Ich verwende RapidXML 1.13 und den GCC 4.5.2<br />
Hat jemand eine Ahnung warum g++ denkt, dass &lt; in der Zeile 27 ein Operator ist?</p>
<p>Danke für Eure Hilfe schonmal im Voraus,<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292851/problem-mit-template-definition</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 15:41:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292851.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Sep 2011 10:51:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Template-Definition on Mon, 19 Sep 2011 10:51:13 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgenden Code der unter Linux in einer Lib laufen soll. Leider mache irgend etwas falsch.</p>
<pre><code class="language-cpp">#include &lt;string.h&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

#include &lt;rapidxml/rapidxml_print.hpp&gt;

using namespace rapidxml;

template&lt;class Ch = char&gt;
class CParseXML
{
private:
	char *ParseText;
	rapidxml::xml_document&lt;Ch&gt; m_doc; // character type defaults to char

public:
	CParseXML(const std::string&amp; File) : ParseText(NULL)
	{
		if (strlen(ParseText))
			Parse(ParseText);
	}

	long Parse (char *XmlString) {
		long RC = 0;
		try {
			m_doc.parse&lt;parse_default&gt;(XmlString);    // 0 means default parse flags
		}
		catch (rapidxml::parse_error&amp; ex) {
			std::cout &lt;&lt; ex.what();
			RC = -1;
		}

		return RC;
	}

	~CParseXML(void) {
		delete [] ParseText;
	};
};

long ParseLicence(const char *OutStream, const std::string&amp; SerialNumber) {
	CParseXML&lt;&gt; *pParseXML = new CParseXML&lt;&gt;(OutStream);
	if (!pParseXML) return -1;
}
</code></pre>
<p>nach:</p>
<pre><code>g++ test.cpp -I. -fPIC -c -Wall
</code></pre>
<p>bekomme ich folgendes:</p>
<pre><code>dan@dev-pc-dan-linux:~/src/test$ g++ test.cpp -I. -fPIC -c -Wall
test.cpp: In member function ‘long int CParseXML&lt;Ch&gt;::Parse(char*) [with Ch = char]’:
test.cpp:21:4:   instantiated from ‘CParseXML&lt;Ch&gt;::CParseXML(const std::string&amp;) [with Ch = char, std::string = std::basic_string&lt;char&gt;]’
test.cpp:43:52:   instantiated from here
test.cpp:27:4: error: invalid operands of types ‘&lt;unresolved overloaded function type&gt;’ and ‘const int’ to binary ‘operator&lt;’
test.cpp: In function ‘long int ParseLicence(const char*, const std::string&amp;)’:
test.cpp:45:1: warning: control reaches end of non-void function
dan@dev-pc-dan-linux:~/src/test$
</code></pre>
<p>Ich verwende RapidXML 1.13 und den GCC 4.5.2<br />
Hat jemand eine Ahnung warum g++ denkt, dass &lt; in der Zeile 27 ein Operator ist?</p>
<p>Danke für Eure Hilfe schonmal im Voraus,<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121198</guid><dc:creator><![CDATA[cdannebe]]></dc:creator><pubDate>Mon, 19 Sep 2011 10:51:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template-Definition on Mon, 19 Sep 2011 10:56:58 GMT]]></title><description><![CDATA[<p>Meintest du nicht</p>
<pre><code class="language-cpp">m_doc.Parse&lt;parse_default&gt;(XmlString);
</code></pre>
<p>?</p>
<p>Der Compiler erkennt parse nicht und denkt danach kommt ein &lt; Operator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121200</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Mon, 19 Sep 2011 10:56:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template-Definition on Mon, 19 Sep 2011 11:14:30 GMT]]></title><description><![CDATA[<p>cdannebe schrieb:</p>
<blockquote>
<pre><code class="language-cpp">m_doc.parse&lt;parse_default&gt;(XmlString);
</code></pre>
</blockquote>
<p>m_doc hängt von einem template-parameter ab, der compiler weiß zu dem Zeitpunkt noch nichts genaueres über parse, du musst ihm also sagen, dass parse ein template ist:</p>
<pre><code class="language-cpp">m_doc.template parse&lt;parse_default&gt;(XmlString);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2121205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121205</guid><dc:creator><![CDATA[jokester_]]></dc:creator><pubDate>Mon, 19 Sep 2011 11:14:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template-Definition on Mon, 19 Sep 2011 11:20:24 GMT]]></title><description><![CDATA[<p>jokester_ schrieb:</p>
<blockquote>
<p>cdannebe schrieb:</p>
<blockquote>
<pre><code class="language-cpp">m_doc.parse&lt;parse_default&gt;(XmlString);
</code></pre>
</blockquote>
<p>m_doc hängt von einem template-parameter ab, der compiler weiß zu dem Zeitpunkt noch nichts genaueres über parse, du musst ihm also sagen, dass parse ein template ist:</p>
<pre><code class="language-cpp">m_doc.template parse&lt;parse_default&gt;(XmlString);
</code></pre>
</blockquote>
<p>Danke jokester_ für Deine schnelle Antwort. Hat geklappt.<br />
Weist Du auch warum der Code mit VS2010 funktioniert hat?</p>
<p>Christian</p>
<p>PS: Ein Danke auch an [Rewind] für die Mühen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121210</guid><dc:creator><![CDATA[cdannebe]]></dc:creator><pubDate>Mon, 19 Sep 2011 11:20:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template-Definition on Mon, 19 Sep 2011 11:27:21 GMT]]></title><description><![CDATA[<p>Deine Initialisierung von ParseText im Konstruktor ist irgendwie komisch.<br />
Die Dreierregel hast Du auch verletzt.</p>
<p>Der Compiler beschwert sich aber deswegen:</p>
<p>cdannebe schrieb:</p>
<blockquote>
<pre><code>[b]template&lt;class Ch = char&gt;[/b]
class CParseXML
{
private:
	char *ParseText;
	rapidxml::xml_document&lt;[b]Ch[/b]&gt; [b]m_doc[/b];
public:
	:::

	long Parse (char *XmlString) {
		long RC = 0;
		try {
			[b]m_doc[/b].parse&lt;parse_default&gt;(XmlString);
		}
		:::
	}

	:::
};
</code></pre>
</blockquote>
<p>Ob das &lt; hinter parse jetzt der kleiner-als-Operator ist oder eine Spitze Klammer für Templateparameter hängt jetzt davon ab, was parse eigentlich ist. Da m_doc vom Templateparameter Ch abhängt, kann der Compiler beim &quot;ersten Durchgang&quot; (also vor dem Instanziieren) nicht wissen, was parse wirlich ist. Der Standard fordert, dass der Programmierer hier sagen muss, ob es sich um ein Funktions-Template handelt. Richtig sieht das dann so aus:</p>
<pre><code>m_doc.template parse&lt;parse_default&gt;(XmlString);
</code></pre>
<p>Der Microsoft Compiler verzeiht die ein fehlendes template, weil er sich das Template vor dem Instanziieren gar nicht richtig anguckt und er gar nicht wissen will, was das &lt; da zu bedeuten hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121214</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 19 Sep 2011 11:27:21 GMT</pubDate></item></channel></rss>