<?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[Ableiten eines Klassentemplates aus einem Klassentemplate]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende beide Klassentemplates:</p>
<pre><code class="language-cpp">template&lt;class C&gt; class abc
{
private:
	C* m_container;
public:
	C* container() { return m_container; }
};

template&lt;class C&gt; class def : public abc&lt;C&gt;
{
public:
	void next() { container(); }
};
</code></pre>
<p>Wenn ich das versuche zu kompilieren, bekomme ich bzgl.</p>
<pre><code class="language-cpp">void next() { container(); }
</code></pre>
<p>die Fehlermeldung</p>
<blockquote>
<p>there are no arguments to ‘container’ that depend on a template parameter, so a declaration of ‘container’ must be available<br />
(if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)</p>
</blockquote>
<p>Ersetze ich allerdings def durch</p>
<pre><code class="language-cpp">class def : public abc&lt;int&gt;
{
public:
	void next() { container(); }
};
</code></pre>
<p>kann ich kompilieren.</p>
<p>Weiss jemand, was ich hier falsch mache?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/223800/ableiten-eines-klassentemplates-aus-einem-klassentemplate</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 22:09:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/223800.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Oct 2008 09:04:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ableiten eines Klassentemplates aus einem Klassentemplate on Wed, 01 Oct 2008 09:04:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende beide Klassentemplates:</p>
<pre><code class="language-cpp">template&lt;class C&gt; class abc
{
private:
	C* m_container;
public:
	C* container() { return m_container; }
};

template&lt;class C&gt; class def : public abc&lt;C&gt;
{
public:
	void next() { container(); }
};
</code></pre>
<p>Wenn ich das versuche zu kompilieren, bekomme ich bzgl.</p>
<pre><code class="language-cpp">void next() { container(); }
</code></pre>
<p>die Fehlermeldung</p>
<blockquote>
<p>there are no arguments to ‘container’ that depend on a template parameter, so a declaration of ‘container’ must be available<br />
(if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)</p>
</blockquote>
<p>Ersetze ich allerdings def durch</p>
<pre><code class="language-cpp">class def : public abc&lt;int&gt;
{
public:
	void next() { container(); }
};
</code></pre>
<p>kann ich kompilieren.</p>
<p>Weiss jemand, was ich hier falsch mache?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1591304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1591304</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Wed, 01 Oct 2008 09:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to Ableiten eines Klassentemplates aus einem Klassentemplate on Wed, 01 Oct 2008 09:11:40 GMT]]></title><description><![CDATA[<p>Das Problem in diesem Fall ist, dass def&lt;&gt; selbst ein Template ist, welches von einem Template erbt. Instanziert wird beides erst bei der Benutzung, so dass zu dem Zeitpunkt der Definition von def&lt;&gt; noch nicht bekannt ist, wie abc&lt;C&gt; aussieht, da ja später noch eine Spezialisierung von abc für ein bestimmtes C auftauchen könnte. Deshalb kann der Compiler erstmal nicht davon ausgehen, dass abc&lt;C&gt; dieselben Member hat, wie das Basistemplate abc&lt;&gt;.</p>
<p>Ist def allerdings selbst kein Template, muss abc&lt;int&gt; vollständig bekannt sein. Dadurch weiss der Compiler auch sicher, ob abc&lt;int&gt; einen Member namens container hat, oder eben nicht.</p>
<p>Die Lösung des Problems ist, den Member der Basisklasse zu qualifizieren, oder über this darauf zuzugreifen:</p>
<pre><code class="language-cpp">template&lt;class C&gt; class def : public abc&lt;C&gt;
{
public:
    void next() { abc&lt;C&gt;::container(); /* oder */ this-&gt;container(); }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1591312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1591312</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 01 Oct 2008 09:11:40 GMT</pubDate></item></channel></rss>