<?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[Templatefunktion wird nicht gefunden]]></title><description><![CDATA[<p>Ich habe einen Sourcecode in Java, den ich nach C++ umschreibe.<br />
Der alte Code arbeitet viel mit der Klasse java.lang.String.<br />
Um moeglichst wenig Aenderungen daran vorzunehmen habe ich eine Klasse String von std::string abgeleitet und ihr die noetigen Methoden geschrieben, so dass ich am alten Code desbzgl. keine Aenderungen vornehmen musste(Prinzip: &quot;old code calls new code&quot;), unter anderem die Methoden startsWith(...) und endsWith(...).<br />
<a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html" rel="nofollow">http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html</a><br />
Da beide Methoden recht aehnlich sind, habe ich die Core-Funktionalitaet in eine separate Template Funktion verbannt, die dann nur noch mit den entsprechenden Parametern aufgerufen wird.</p>
<pre><code class="language-cpp">bool String::startsWith(const String&amp; prefix) const
{
    return startsEndsWith&lt;const_iterator, prefix.begin(), this-&gt;begin()&gt;(prefix);
}

bool String::endsWith(const String&amp; suffix) const
{
    return startsEndsWith&lt;const_reverse_iterator, suffix.rbegin(), this-&gt;rbegin()&gt;(suffix);
}
</code></pre>
<p>Die Template Funktion ist eine Abstraktion der beiden *With(...) Methoden und sieht wie folgt aus:</p>
<pre><code class="language-cpp">template&lt;typename iterator, iterator thisOffset, iterator argOffset&gt;
bool String::startsEndsWith(const String&amp; presuffix) const
{
    int i=presuffix.length();
    iterator it(thisOffset), it0(argOffset);

    while(*it++ == *it0++ &amp;&amp; i--);
    if(i==0)
        return true;
    return false;
}
</code></pre>
<p>Leider ist noch irgendwo der Wurm drin, denn der Compiler meint:</p>
<pre><code>compiling aiplayer.cpp (g++)
./string.hpp: In member function 'bool String::endsWith(const String&amp;) const':
./string.hpp:64: error: 'suffix' cannot appear in a constant-expression
./string.hpp:64: error: `.' cannot appear in a constant-expression
./string.hpp:64: error: a function call cannot appear in a constant-expression
./string.hpp:64: error: `this' cannot appear in a constant-expression
./string.hpp:64: error: '-&gt;' cannot appear in a constant-expression
./string.hpp:64: error: a function call cannot appear in a constant-expression
./string.hpp:64: error: no matching function for call to 'String::startsEndsWith(const String&amp;) const'
</code></pre>
<p>Anscheinend findet er meine Template Funktion gar nicht, obwohl die Klasse String und String::startsWith(...) und String::endsWith(...), sowieString::startsEndsWith(...) alle in einem Sourcefile, naemlich &quot;string.hpp&quot; sind.</p>
<p>Schonmal Danke im Voraus und sorry, falls der &quot;Fehler&quot; offensichtlich ist - bin atm ein bisschen aus der Uebung.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/148437/templatefunktion-wird-nicht-gefunden</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 20:47:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/148437.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 May 2006 16:58:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templatefunktion wird nicht gefunden on Fri, 26 May 2006 16:58:42 GMT]]></title><description><![CDATA[<p>Ich habe einen Sourcecode in Java, den ich nach C++ umschreibe.<br />
Der alte Code arbeitet viel mit der Klasse java.lang.String.<br />
Um moeglichst wenig Aenderungen daran vorzunehmen habe ich eine Klasse String von std::string abgeleitet und ihr die noetigen Methoden geschrieben, so dass ich am alten Code desbzgl. keine Aenderungen vornehmen musste(Prinzip: &quot;old code calls new code&quot;), unter anderem die Methoden startsWith(...) und endsWith(...).<br />
<a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html" rel="nofollow">http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html</a><br />
Da beide Methoden recht aehnlich sind, habe ich die Core-Funktionalitaet in eine separate Template Funktion verbannt, die dann nur noch mit den entsprechenden Parametern aufgerufen wird.</p>
<pre><code class="language-cpp">bool String::startsWith(const String&amp; prefix) const
{
    return startsEndsWith&lt;const_iterator, prefix.begin(), this-&gt;begin()&gt;(prefix);
}

bool String::endsWith(const String&amp; suffix) const
{
    return startsEndsWith&lt;const_reverse_iterator, suffix.rbegin(), this-&gt;rbegin()&gt;(suffix);
}
</code></pre>
<p>Die Template Funktion ist eine Abstraktion der beiden *With(...) Methoden und sieht wie folgt aus:</p>
<pre><code class="language-cpp">template&lt;typename iterator, iterator thisOffset, iterator argOffset&gt;
bool String::startsEndsWith(const String&amp; presuffix) const
{
    int i=presuffix.length();
    iterator it(thisOffset), it0(argOffset);

    while(*it++ == *it0++ &amp;&amp; i--);
    if(i==0)
        return true;
    return false;
}
</code></pre>
<p>Leider ist noch irgendwo der Wurm drin, denn der Compiler meint:</p>
<pre><code>compiling aiplayer.cpp (g++)
./string.hpp: In member function 'bool String::endsWith(const String&amp;) const':
./string.hpp:64: error: 'suffix' cannot appear in a constant-expression
./string.hpp:64: error: `.' cannot appear in a constant-expression
./string.hpp:64: error: a function call cannot appear in a constant-expression
./string.hpp:64: error: `this' cannot appear in a constant-expression
./string.hpp:64: error: '-&gt;' cannot appear in a constant-expression
./string.hpp:64: error: a function call cannot appear in a constant-expression
./string.hpp:64: error: no matching function for call to 'String::startsEndsWith(const String&amp;) const'
</code></pre>
<p>Anscheinend findet er meine Template Funktion gar nicht, obwohl die Klasse String und String::startsWith(...) und String::endsWith(...), sowieString::startsEndsWith(...) alle in einem Sourcefile, naemlich &quot;string.hpp&quot; sind.</p>
<p>Schonmal Danke im Voraus und sorry, falls der &quot;Fehler&quot; offensichtlich ist - bin atm ein bisschen aus der Uebung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1065671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1065671</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Fri, 26 May 2006 16:58:42 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion wird nicht gefunden on Fri, 26 May 2006 17:17:04 GMT]]></title><description><![CDATA[<p>Templateparameter müssen compiletime-konstant sein, da Templates, anders als Generics, vollständig zur Compiletime aufgelöst werden, suffix als Parameter einer zur Laufzeit aufgerufenen Funktion ist das logischerweise nicht.</p>
<p>Du darfst nur den Iterator-Typ in die Template-Argumentliste packen, die übergebenen Iteratoren müssen in die normale Argumentliste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1065684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1065684</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 26 May 2006 17:17:04 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion wird nicht gefunden on Sat, 27 May 2006 11:16:33 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Templateparameter müssen compiletime-konstant sein, da Templates, anders als Generics, vollständig zur Compiletime aufgelöst werden, suffix als Parameter einer zur Laufzeit aufgerufenen Funktion ist das logischerweise nicht.</p>
<p>Du darfst nur den Iterator-Typ in die Template-Argumentliste packen, die übergebenen Iteratoren müssen in die normale Argumentliste.</p>
</blockquote>
<p>Aber die beiden uebergebenen Iteratoren sind doch konstant --&gt;</p>
<pre><code class="language-cpp">const_iterator begin() const;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1066019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1066019</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 27 May 2006 11:16:33 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion wird nicht gefunden on Sat, 27 May 2006 11:21:03 GMT]]></title><description><![CDATA[<p>Raptor schrieb:</p>
<blockquote>
<p>Aber die beiden uebergebenen Iteratoren sind doch konstant --&gt;</p>
<pre><code class="language-cpp">const_iterator begin() const;
</code></pre>
</blockquote>
<p>Da hast du etwas falsch verstanden - das &quot;const&quot; dort bedeutet, daß die Methode begin() den darunterliegenden Container als konstant betrachtet. Der zurückgegebene Iterator ist trotzdem erst zur Laufzeit bestimmt (und kann sich selbst für einen gegebenen String auch zur Laufzeit ändern - ganz davon abgesehen, daß der tatsächlich verwendete String erst beim Aufruf feststehen wird).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1066022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1066022</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 27 May 2006 11:21:03 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion wird nicht gefunden on Sat, 27 May 2006 11:24:46 GMT]]></title><description><![CDATA[<p>Eigentlich eine einfache logische Überlegung:<br />
Du kannst die Templatefunktion zur Laufzeit mit jeder beliebigen Collection benutzen? Dann sind die Iteratoren dieser Collection keine Compiletime-Konstanten <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1066025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1066025</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Sat, 27 May 2006 11:24:46 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion wird nicht gefunden on Sat, 27 May 2006 11:28:43 GMT]]></title><description><![CDATA[<p>Kann evtl. noch einmal jemand zusammenfassen, wann ich bei einer Template Funktion meine Parameter als (1.) Template Parameter oder (2.) Funktions Parameter uebergeben kann/muss?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1066027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1066027</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 27 May 2006 11:28:43 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion wird nicht gefunden on Sat, 27 May 2006 11:40:42 GMT]]></title><description><![CDATA[<p>Als Template-Parameter kannst du Objekte angeben, die bereits für den Compiler bekannt sind - Typnamen (das dürfte das häufigste sein) und Ganzzahl-Literale (Achtung: Keine Gleitkomma-Literale). (eventuell noch etwas mehr, aber das fällt unter &quot;Exoten&quot;)</p>
<p>Als regulären Funktionsparameter kannst du alles angeben, was sich zur Laufzeit in den entsprechenden Parametertyp umwandeln lässt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1066034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1066034</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 27 May 2006 11:40:42 GMT</pubDate></item></channel></rss>