<?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[Verschiedene Policies ueber Template Spezialisierung geht nicht]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich wollte gerne ausprobieren (G++ 4.3.2 auf Debian) ob ich per Template Spezialisierung zwischen der Verwendung verschiedener Policies unterscheiden kann, leider kompiliert mein Code nicht, warum?!</p>
<pre><code class="language-cpp">template&lt; typename T &gt; class NewPolicy;
template&lt; typename T &gt; class MallocPolicy;
template&lt; typename U &gt; class UserClass;

/*
    UserClass implementations
//*/
template&lt; typename U &gt;
class UserClass : public NewPolicy&lt; U &gt;
{
public:
  void doSomething()
  {
    // ...
  }
// ...
};

template&lt;&gt;
class UserClass&lt; char &gt; : public MallocPolicy&lt; char &gt;
{
  void doSomething()
  {
    // ...
  }
// ...
};

/*
    policies, eine benutzt 'new', die andere 'malloc' 
    daher der Name, aber soll nur ein Bsp sein..
//*/
template&lt; typename T &gt;
class NewPolicy
{
// ...
};

template&lt; typename T &gt;
class MallocPolicy
{
// ...
};

/* 
    main 
//*/
int main() 
{
  UserClass&lt; int &gt; uc_1;
  uc_1.doSomething(); // verwende automatischerweise 'new' wegen NewPolicy fuer alles was hier mit 'int' zu tun hat

  UserClass&lt; char &gt; uc_2;
  uc_2.doSomething(); // verwende automatisch die MallocPolicy fuer alles was mit 'char' zu tun hat

  return 0;
}
</code></pre>
<p>Gut, die Template Spezialisierung ohne Vererbung kompiliert. Das ganze mit Vererbung Unterschiedlicher Policy Klassen, ohne dass diese selber wiederum Template Parameter besitzen, kompiliert ebenfalls. Ich kann, ausserdem, im Fall der NewPolicy diese sogar als Template Klasse kompilieren und den Template Typ U uebergeben. Aaaaaaber, das ganze scheitert, sobald ich versuche nicht einen Template Typ sondern einen &quot;konkreten&quot; Typ, zB int, char, std::string, etc - uebergebe.</p>
<p>Die Error Meldungen:</p>
<blockquote>
<p>error: invalid use of incomplete type 'struct MallocPolicy&lt; char &gt;'<br />
error: declaration of 'struct MallocPolicy&lt; char &gt;'</p>
</blockquote>
<p>Fragen:<br />
1. Woran liegts? Wie bekomme ich meinen Code kompiliert?</p>
<p>2. Ausserdem, ist es bei Template Spezialisierungen eigentlich nicht irgendwie moeglich zB so eine Funktion wie &quot;doSomething()&quot; fuer beide Implementierungen zugaenglich zu machen? Klar, afaik werden nur die Versionen kompiliert, die auch benoetigt werden, aber dennoch ist es in gewisser Weise redundanter Code. Kann man dem nicht irgendwie auskommen?</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228994/verschiedene-policies-ueber-template-spezialisierung-geht-nicht</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 10:10:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228994.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Dec 2008 16:30:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verschiedene Policies ueber Template Spezialisierung geht nicht on Fri, 05 Dec 2008 16:30:22 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich wollte gerne ausprobieren (G++ 4.3.2 auf Debian) ob ich per Template Spezialisierung zwischen der Verwendung verschiedener Policies unterscheiden kann, leider kompiliert mein Code nicht, warum?!</p>
<pre><code class="language-cpp">template&lt; typename T &gt; class NewPolicy;
template&lt; typename T &gt; class MallocPolicy;
template&lt; typename U &gt; class UserClass;

/*
    UserClass implementations
//*/
template&lt; typename U &gt;
class UserClass : public NewPolicy&lt; U &gt;
{
public:
  void doSomething()
  {
    // ...
  }
// ...
};

template&lt;&gt;
class UserClass&lt; char &gt; : public MallocPolicy&lt; char &gt;
{
  void doSomething()
  {
    // ...
  }
// ...
};

/*
    policies, eine benutzt 'new', die andere 'malloc' 
    daher der Name, aber soll nur ein Bsp sein..
//*/
template&lt; typename T &gt;
class NewPolicy
{
// ...
};

template&lt; typename T &gt;
class MallocPolicy
{
// ...
};

/* 
    main 
//*/
int main() 
{
  UserClass&lt; int &gt; uc_1;
  uc_1.doSomething(); // verwende automatischerweise 'new' wegen NewPolicy fuer alles was hier mit 'int' zu tun hat

  UserClass&lt; char &gt; uc_2;
  uc_2.doSomething(); // verwende automatisch die MallocPolicy fuer alles was mit 'char' zu tun hat

  return 0;
}
</code></pre>
<p>Gut, die Template Spezialisierung ohne Vererbung kompiliert. Das ganze mit Vererbung Unterschiedlicher Policy Klassen, ohne dass diese selber wiederum Template Parameter besitzen, kompiliert ebenfalls. Ich kann, ausserdem, im Fall der NewPolicy diese sogar als Template Klasse kompilieren und den Template Typ U uebergeben. Aaaaaaber, das ganze scheitert, sobald ich versuche nicht einen Template Typ sondern einen &quot;konkreten&quot; Typ, zB int, char, std::string, etc - uebergebe.</p>
<p>Die Error Meldungen:</p>
<blockquote>
<p>error: invalid use of incomplete type 'struct MallocPolicy&lt; char &gt;'<br />
error: declaration of 'struct MallocPolicy&lt; char &gt;'</p>
</blockquote>
<p>Fragen:<br />
1. Woran liegts? Wie bekomme ich meinen Code kompiliert?</p>
<p>2. Ausserdem, ist es bei Template Spezialisierungen eigentlich nicht irgendwie moeglich zB so eine Funktion wie &quot;doSomething()&quot; fuer beide Implementierungen zugaenglich zu machen? Klar, afaik werden nur die Versionen kompiliert, die auch benoetigt werden, aber dennoch ist es in gewisser Weise redundanter Code. Kann man dem nicht irgendwie auskommen?</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625890</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Fri, 05 Dec 2008 16:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Policies ueber Template Spezialisierung geht nicht on Fri, 05 Dec 2008 17:04:27 GMT]]></title><description><![CDATA[<p>Fabeltier schrieb:</p>
<blockquote>
<p>1. Woran liegts? Wie bekomme ich meinen Code kompiliert?</p>
</blockquote>
<p>Die Klassentemplates <code>NewPolicy</code> und <code>MallocPolicy</code> sollten vor dem Klassentemplate <code>UserClass</code> definiert werden und nicht nur deklariert. Sonst geht das nicht.</p>
<p>Fabeltier schrieb:</p>
<blockquote>
<p>2. Ausserdem, ist es bei Template Spezialisierungen eigentlich nicht irgendwie moeglich zB so eine Funktion wie &quot;doSomething()&quot; fuer beide Implementierungen zugaenglich zu machen? Klar, afaik werden nur die Versionen kompiliert, die auch benoetigt werden, aber dennoch ist es in gewisser Weise redundanter Code. Kann man dem nicht irgendwie auskommen?</p>
</blockquote>
<p>Eine Möglichkeit wäre eine Art von Pimpl-Idiom. Du schreibst einfach noch eine dritte Klasse, vielleicht in einem <code>namespace detail</code> , und definierst dort die Methode. Bei den anderen erstellst du diese Klasse als Member und leitest alle Aufrufe jeweils darauf um. Dadurch musst du nicht die ganze Methode immer neu implementieren, sondern kannst nur immer eine Umleitung hinschreiben <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="😉"
    /><br />
Etwas anderes ist mir nicht bekannt.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625900</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 05 Dec 2008 17:04:27 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Policies ueber Template Spezialisierung geht nicht on Fri, 05 Dec 2008 17:28:40 GMT]]></title><description><![CDATA[<p>Danke, es kompiliert!!!</p>
<p>Nur, frag ich mich jetzt etwas warum reicht eine Forward Deklaration nicht? Hum, hat vllt auch mit der &quot;Compile-time Aktivitaet&quot; von Templates zu tun, also das nur der Code compiliert wird der hier instantiiert wird bei Templates?</p>
<p>Zu 2. so eine &quot;Umgehung&quot; ueber eine dritte Klasse hatte ich mir auch schon ueberlegt, das scheint aber auch nur die intuitive Vorgehensweise zu sein. mit Namespace scheint das einigermassen brauchbar zu sein, super! :xmas1: :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625925</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Fri, 05 Dec 2008 17:28:40 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Policies ueber Template Spezialisierung geht nicht on Fri, 05 Dec 2008 18:01:14 GMT]]></title><description><![CDATA[<p>Fabeltier schrieb:</p>
<blockquote>
<p>Nur, frag ich mich jetzt etwas warum reicht eine Forward Deklaration nicht? Hum, hat vllt auch mit der &quot;Compile-time Aktivitaet&quot; von Templates zu tun, also das nur der Code compiliert wird der hier instantiiert wird bei Templates?</p>
</blockquote>
<p>Weil das allgemein so ist, eine Klasse muss definiert sein, wenn man von ihr ableiten will. Du kannst bei normalen Klassen auch nicht von einer Deklaration ableiten, da wird dir jeder Kompiler rumschreien, bis deine Ohren abfallen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Wieso dem so ist, da musst du das Standardkomittee fragen. Aber ich nehme mal an, man hat es gemacht, um die Arbeit des Interpreters zu vereinfachen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625938</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 05 Dec 2008 18:01:14 GMT</pubDate></item></channel></rss>