<?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[CRTP und Instanziierung eines Memberfunktion-Templates]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich würde gerne innerhalb eines CRTP-Konstrukts eine Template-Memberfunktion benutzen, deren Template-Argument sich nicht anhand ihrer Parameter ableiten läßt. Ich gebe also explizit den Typ an, für den die Funktion instanziiert werden soll. Aber seht selbst:</p>
<pre><code class="language-cpp">template &lt;typename D&gt;
struct Base {
    void bar() {
        D &amp; d = *static_cast&lt;D*&gt;(this);
        d.foo&lt;int&gt;();   // kompiliert nicht!
    }
};

struct Derived : public Base&lt;Derived&gt; {
    template &lt;typename T&gt;
    void foo() { }
};

int main() {
    Derived x;
    x.foo&lt;int&gt;();       // funktioniert!
    x.bar();
}
</code></pre>
<p>Mein gcc sagt dazu:</p>
<pre><code>test.cc: In member function ‘void Base&lt;D&gt;::bar()’:
test.cc:5: error: expected primary-expression before ‘int’
test.cc:5: error: expected ‘;’ before ‘int’
</code></pre>
<p>Daraus werde ich nicht wirklich schlau. Wie man sieht kann ich die Funktion anderswo problemlos auf die selbe Weise aufrufen, also warum nicht dort in der Basisklasse?</p>
<p>Danke schonmal im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301045/crtp-und-instanziierung-eines-memberfunktion-templates</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 07:37:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301045.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 Mar 2012 22:15:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CRTP und Instanziierung eines Memberfunktion-Templates on Sat, 17 Mar 2012 22:15:19 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich würde gerne innerhalb eines CRTP-Konstrukts eine Template-Memberfunktion benutzen, deren Template-Argument sich nicht anhand ihrer Parameter ableiten läßt. Ich gebe also explizit den Typ an, für den die Funktion instanziiert werden soll. Aber seht selbst:</p>
<pre><code class="language-cpp">template &lt;typename D&gt;
struct Base {
    void bar() {
        D &amp; d = *static_cast&lt;D*&gt;(this);
        d.foo&lt;int&gt;();   // kompiliert nicht!
    }
};

struct Derived : public Base&lt;Derived&gt; {
    template &lt;typename T&gt;
    void foo() { }
};

int main() {
    Derived x;
    x.foo&lt;int&gt;();       // funktioniert!
    x.bar();
}
</code></pre>
<p>Mein gcc sagt dazu:</p>
<pre><code>test.cc: In member function ‘void Base&lt;D&gt;::bar()’:
test.cc:5: error: expected primary-expression before ‘int’
test.cc:5: error: expected ‘;’ before ‘int’
</code></pre>
<p>Daraus werde ich nicht wirklich schlau. Wie man sieht kann ich die Funktion anderswo problemlos auf die selbe Weise aufrufen, also warum nicht dort in der Basisklasse?</p>
<p>Danke schonmal im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2192467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192467</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Sat, 17 Mar 2012 22:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to CRTP und Instanziierung eines Memberfunktion-Templates on Sat, 17 Mar 2012 22:20:47 GMT]]></title><description><![CDATA[<p>Der Compiler kann an der Stelle nicht ableiten, was foo ist. Änhlich wie bei der Notwendigkeit von typename in manchen Fällen musst du hier sagen, dass foo ein template ist und das nachfolgende &lt; also einen Templateparameter einleitet und zum Beispiel kein Kleiner-Operator ist. Also:</p>
<pre><code class="language-cpp">d.template foo&lt;int&gt;();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2192470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192470</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 17 Mar 2012 22:20:47 GMT</pubDate></item><item><title><![CDATA[Reply to CRTP und Instanziierung eines Memberfunktion-Templates on Sat, 17 Mar 2012 22:32:31 GMT]]></title><description><![CDATA[<p>Ahh... Tausend Dank für die schnelle Antwort.<br />
Jetzt wo ich das sehe kommt es mir auch wieder irgendwie bekannt vor. Mein C++ ist wohl nach zwei Jahren unfreiwilliger Java-Programmierung doch etwas eingerostet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2192472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192472</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Sat, 17 Mar 2012 22:32:31 GMT</pubDate></item></channel></rss>