<?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[Eigenschaften von Basisklassen innerhalb von Templates erben]]></title><description><![CDATA[<p>Ich wollte mal wissen ob man innerhalb von Templates auch erben kann.</p>
<p>Ich habe eine abstrakte Basisklasse</p>
<pre><code class="language-cpp">template typename&lt;DatenTyp&gt;
class Abstract
{
  public:
    a() = 0;
    b() = 0;
}
</code></pre>
<p>und eine Implementierungsklasse</p>
<pre><code class="language-cpp">template typename&lt;DatenTyp&gt;
class Impl
{
  public:

    a() { ... };
    b() { ... };
}
</code></pre>
<p>und meine übergeordnete Template Klasse</p>
<pre><code class="language-cpp">template&lt;typename A,typename B, typename DatenTyp&gt;
class Base
{
  private:
    class Impl : public Abstract { };

  public:
    Base(const shared_ptr&lt;DataType&gt; &amp;data) : Impl(data) { ... }
}
</code></pre>
<p>Bisher klappt es so nicht, daher wollte ich wissen ob es generell überhaupt möglich ist bevor ich herumsuche.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291159/eigenschaften-von-basisklassen-innerhalb-von-templates-erben</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 21:25:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291159.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Aug 2011 21:46:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Thu, 11 Aug 2011 21:46:37 GMT]]></title><description><![CDATA[<p>Ich wollte mal wissen ob man innerhalb von Templates auch erben kann.</p>
<p>Ich habe eine abstrakte Basisklasse</p>
<pre><code class="language-cpp">template typename&lt;DatenTyp&gt;
class Abstract
{
  public:
    a() = 0;
    b() = 0;
}
</code></pre>
<p>und eine Implementierungsklasse</p>
<pre><code class="language-cpp">template typename&lt;DatenTyp&gt;
class Impl
{
  public:

    a() { ... };
    b() { ... };
}
</code></pre>
<p>und meine übergeordnete Template Klasse</p>
<pre><code class="language-cpp">template&lt;typename A,typename B, typename DatenTyp&gt;
class Base
{
  private:
    class Impl : public Abstract { };

  public:
    Base(const shared_ptr&lt;DataType&gt; &amp;data) : Impl(data) { ... }
}
</code></pre>
<p>Bisher klappt es so nicht, daher wollte ich wissen ob es generell überhaupt möglich ist bevor ich herumsuche.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105070</guid><dc:creator><![CDATA[templates]]></dc:creator><pubDate>Thu, 11 Aug 2011 21:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Thu, 11 Aug 2011 21:58:35 GMT]]></title><description><![CDATA[<p>Die globale Klasse &quot;Impl&quot; hat absolut gar nichts mit &quot;Abstrakt&quot; zu tun (außer daß sie ein paar gleichnamige Methoden hat). Und bei der Vererbung mußt du natürlich angeben, von welcher Version der Basisklasse du ableiten willst, also <code>class Impl : public Abstract&lt;DatenTyp&gt; {...}</code> .</p>
<p>PS: Un für die Zukunft: Wenn du noch dazusagst was der Compiler zu deinem Code gesagt hast, können wir wesentlich gezielter helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105075</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 Aug 2011 21:58:35 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Thu, 11 Aug 2011 22:08:38 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Die globale Klasse &quot;Impl&quot; hat absolut gar nichts mit &quot;Abstrakt&quot; zu tun (außer daß sie ein paar gleichnamige Methoden hat).</p>
</blockquote>
<p>Danke für die schnelle Hilfe.<br />
Impl soll die Implementierung sein.<br />
Abstakt soll die abstrakte Basisklasse darstellen.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Und bei der Vererbung mußt du natürlich angeben, von welcher Version der Basisklasse du ableiten willst, also <code>class Impl : public Abstract&lt;DatenTyp&gt; {...}</code> .</p>
</blockquote>
<p>wenn ich</p>
<pre><code class="language-cpp">class Impl : public Abstract&lt;DatenTyp&gt; {...}
</code></pre>
<p>statt</p>
<pre><code class="language-cpp">class Impl : public Abstract{...}
</code></pre>
<p>verwende, dann bekomme ich diesen Fehler</p>
<pre><code>error C2143: syntax error : missing ',' before '&lt;'
</code></pre>
<p>wahrscheinlich weil ich Impl schon mit einem Template Parameter initialisiere?</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>PS: Un für die Zukunft: Wenn du noch dazusagst was der Compiler zu deinem Code gesagt hast, können wir wesentlich gezielter helfen.</p>
</blockquote>
<p>Ich wollte zunächst sichergehen dass Zeile 5 im ersten Code so funktioniert bevor ich mit etwas anderem anfange weil ich dort den Fehler vermutet habe was wie du es sagst anscheinend nicht so ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105079</guid><dc:creator><![CDATA[templates]]></dc:creator><pubDate>Thu, 11 Aug 2011 22:08:38 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Thu, 11 Aug 2011 22:13:53 GMT]]></title><description><![CDATA[<p>templates schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Die globale Klasse &quot;Impl&quot; hat absolut gar nichts mit &quot;Abstrakt&quot; zu tun (außer daß sie ein paar gleichnamige Methoden hat).</p>
</blockquote>
<p>Danke für die schnelle Hilfe.<br />
Impl soll die Implementierung sein.<br />
Abstakt soll die abstrakte Basisklasse darstellen.</p>
</blockquote>
<p>Dann wäre es auch gut, dem Compiler diesen Zusammenhang mitzuteilen <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="😉"
    /> (idR durch Vererbung)</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Und bei der Vererbung mußt du natürlich angeben, von welcher Version der Basisklasse du ableiten willst, also <code>class Impl : public Abstract&lt;DatenTyp&gt; {...}</code> .</p>
</blockquote>
<p>wenn ich</p>
<pre><code class="language-cpp">class Impl : public Abstract&lt;DatenTyp&gt; {...}
</code></pre>
<p>statt</p>
<pre><code class="language-cpp">class Impl : public Abstract{...}
</code></pre>
<p>verwende, dann bekomme ich diesen Fehler</p>
<pre><code>error C2143: syntax error : missing ',' before '&lt;'
</code></pre>
<p>wahrscheinlich weil ich Impl schon mit einem Template Parameter initialisiere?</p>
</blockquote>
<p>Ist denn die Klasse Abstrakt an der Stelle bekannt, wo du sie verwenden willst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105082</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 Aug 2011 22:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Thu, 11 Aug 2011 22:20:50 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Ist denn die Klasse Abstrakt an der Stelle bekannt, wo du sie verwenden willst?</p>
</blockquote>
<p>Shit ich merke dass ich nicht aufgepasst habe:</p>
<pre><code class="language-cpp">template&lt;typename A,typename B, typename DatenTyp&gt;
class Base
{
  private:
    // A : Abstract, B : Impl
    class B: public A{ };

  public:
    Base(const shared_ptr&lt;DataType&gt; &amp;data) : B(data) { ... }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2105088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105088</guid><dc:creator><![CDATA[templates]]></dc:creator><pubDate>Thu, 11 Aug 2011 22:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Thu, 11 Aug 2011 22:26:06 GMT]]></title><description><![CDATA[<p>Nein, so kann das nicht funktionieren, weil es da Mehrdeutigkeiten beim Bezeichner B gibt (ich bin mir bei den Regeln nicht ganz sicher, aber entweder der Parameter und der innere Typ landen im selben Scope oder letzterer überdeckt den Parameter). Was willst du mit der ganzen Geschichte eigentlich erreichen?</p>
<p>PS: Wenn es dir darum geht, zwischen den voneinander unabhängigen Klassen Abstrakt und Impl nachträglich eine Vererbungsbeziehung zu erzeugen - das ist in C++ nicht möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105089</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 Aug 2011 22:26:06 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Thu, 11 Aug 2011 22:31:58 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>PS: Wenn es dir darum geht, zwischen den voneinander unabhängigen Klassen Abstrakt und Impl nachträglich eine Vererbungsbeziehung zu erzeugen</p>
</blockquote>
<p>Besser könnte man meinen Wunsch nicht beschreiben.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>- das ist in C++ nicht möglich.</p>
</blockquote>
<p>Wie könnte man es sonst angehen. Ich habe fertige abstrakte Basisklassen die im Prinzip auf mehrere Implementierungsklassen passen. Bisher habe ich es normal gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105091</guid><dc:creator><![CDATA[templates]]></dc:creator><pubDate>Thu, 11 Aug 2011 22:31:58 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Thu, 11 Aug 2011 22:37:51 GMT]]></title><description><![CDATA[<p>Normalerweise verwendet man dazu direkte Vererbung, wenn man die betroffenen Klassen schreibt. Wenn die Klasse X die von Interface/Basisklasse Y vorgegebenen Methoden definiert, zeigt sie das, indem sie öffentlich von Y abgeleitet wird (wenn sie mehrere Interfaces unterstützt, ergibt sich entsprechend eine Mehrfachvererbung).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105097</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 Aug 2011 22:37:51 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Fri, 12 Aug 2011 06:42:45 GMT]]></title><description><![CDATA[<p>templates schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Ist denn die Klasse Abstrakt an der Stelle bekannt, wo du sie verwenden willst?</p>
</blockquote>
<p>Shit ich merke dass ich nicht aufgepasst habe:</p>
<pre><code class="language-cpp">template&lt;typename A,typename B, typename DatenTyp&gt;
class Base : public A, public B
{
  public:
    Base(const shared_ptr&lt;DataType&gt; &amp;data) : B(data) { ... }
}
</code></pre>
</blockquote>
<p>nicht einmal dass funktioniert. Er schreibt das die Methoden a() und b() abstrakt sind obwohl ich auch von B ableite und dort alles implementiere?!?</p>
<p>Da muss doch was möglich sein..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105152</guid><dc:creator><![CDATA[templates]]></dc:creator><pubDate>Fri, 12 Aug 2011 06:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Fri, 12 Aug 2011 06:44:31 GMT]]></title><description><![CDATA[<p>Sorry habe in der letzten Nachricht falsch gepastet..<br />
-----------------------------------------------------</p>
<pre><code class="language-cpp">template&lt;typename A,typename B, typename DatenTyp&gt;
class Base : public A, public B
{
  public:
    Base(const shared_ptr&lt;DataType&gt; &amp;data) : B(data) { ... }
}
</code></pre>
<p>nicht einmal dass funktioniert. Er schreibt das die Methoden a() und b() abstrakt sind obwohl ich auch von B ableite und dort alles implementiere?!?</p>
<p>Da muss doch was möglich sein..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105153</guid><dc:creator><![CDATA[templates]]></dc:creator><pubDate>Fri, 12 Aug 2011 06:44:31 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Fri, 12 Aug 2011 08:06:12 GMT]]></title><description><![CDATA[<p>Ich habe mal das Problem in einen großen Codeschnipsel zusammengefasst. Vielleicht weiß ja jemand wie man es doch umgehen kann:</p>
<pre><code class="language-cpp">template &lt; typename Abstract , typename Impl ,  typename DataType &gt;
class Base : public Abstract, public Impl
{
	DataType mpData;

public:

	void run() { std::cout &lt;&lt; &quot;Im Base&quot;; }
};

template&lt;typename DataType&gt;
class Abstract
{
public:

	virtual void a() = 0;
};

template&lt;typename DataType&gt;
class Impl
{
	public:

		void a() { std::cout &lt;&lt; &quot;Im Impl&quot;; }
};

int main(int argc, char** argv)
{
	Base&lt;Abstract&lt;double&gt;,Impl&lt;double&gt;,double&gt; temp;

	temp.a();

	return 0;
}
</code></pre>
<p>Die Fehlermeldung sieht so aus:</p>
<pre><code>1&gt;c:\temp\test.cpp(29): error C2259: 'Base&lt;Abstract,Impl,DataType&gt;' : cannot instantiate abstract class
1&gt;          with
1&gt;          [
1&gt;              Abstract=Abstract&lt;double&gt;,
1&gt;              Impl=Impl&lt;double&gt;,
1&gt;              DataType=double
1&gt;          ]
1&gt;          due to following members:
1&gt;          'void Abstract&lt;DataType&gt;::a(void)' : is abstract
1&gt;          with
1&gt;          [
1&gt;              DataType=double
1&gt;          ]
1&gt;          c:\temp\test.cpp(16) : see declaration of 'Abstract&lt;DataType&gt;::a'
1&gt;          with
1&gt;          [
1&gt;              DataType=double
1&gt;          ]
1&gt;c:\temp\test.cpp(31): error C2385: ambiguous access of 'a'
1&gt;          could be the 'a' in base 'Abstract&lt;double&gt;'
1&gt;          or could be the 'a' in base 'Impl&lt;double&gt;'
1&gt;c:\temp\test.cpp(31): error C3861: 'a': identifier not found
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2105189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105189</guid><dc:creator><![CDATA[templates]]></dc:creator><pubDate>Fri, 12 Aug 2011 08:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Fri, 12 Aug 2011 09:02:25 GMT]]></title><description><![CDATA[<p>Warum versuchst du eigentlich hier krampfhaft statische und dynamische Polymorphie unter einen Hut zu bringen?</p>
<p>Entweder du templatisierts und nutzt einfach die Funktionen die du brauchst:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Base{
public:
  void a(){
    T().a();
  }
};
</code></pre>
<p>Oder aber du nutzt die Vererbung voll aus:</p>
<pre><code class="language-cpp">class Abstract {
public:
  virtual void a() = 0;
}

class Impl1 : Abstract {
  virtual void a() {
    cout &lt;&lt; &quot;Impl1&quot;;
  }
};

class Impl2 : Abstract {
  virtual void a() {
    cout &lt;&lt; &quot;Impl2&quot;;
  }
};

class Base {
public:
  Base(Abstract&amp; a) : a(a) {}
  void run() {
    a.a();
  }
private:
  Abstract&amp; a;
}
</code></pre>
<p>Die Aufrufe und Ausgaben kannste dir ja selber überlegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105230</guid><dc:creator><![CDATA[bmario]]></dc:creator><pubDate>Fri, 12 Aug 2011 09:02:25 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Fri, 12 Aug 2011 09:13:43 GMT]]></title><description><![CDATA[<p>bmario schrieb:</p>
<blockquote>
<p>Warum versuchst du eigentlich hier krampfhaft statische und dynamische Polymorphie unter einen Hut zu bringen?</p>
</blockquote>
<p>Weil man sich praktisch alle zwischenklassen sparen kann. Bei m-Basisklassen und n-Implementierungen macht es schon Sinn sich zu überlegen ob man es nicht doch irgendwie hinkriegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105238</guid><dc:creator><![CDATA[templates]]></dc:creator><pubDate>Fri, 12 Aug 2011 09:13:43 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenschaften von Basisklassen innerhalb von Templates erben on Fri, 12 Aug 2011 09:30:38 GMT]]></title><description><![CDATA[<p>Klingt nach Variante 1: Mach's mit Temples.</p>
<pre><code class="language-cpp">struct Abstract1 {
  virtual void a() = 0;
};

struct Abstrct2 {
  virtual void a() = 0;
};

struct Impl1 : Abstract1 {
  virtual void a() { cout &lt;&lt; &quot;Impl1&quot;;}
};

struct Impl2 : Abstract2 {
  virtual void a() { cout &lt;&lt; &quot;Impl2&quot;;}
};

template&lt;typename Abstract&gt;
class Base {
public:
  Base(Abstract&amp; impl) : impl(impl) {}
  void run() {
    impl.a();
  }
private:
  Abstract&amp; impl;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2105248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105248</guid><dc:creator><![CDATA[bmario]]></dc:creator><pubDate>Fri, 12 Aug 2011 09:30:38 GMT</pubDate></item></channel></rss>