<?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[Template Probleme bei Klassen]]></title><description><![CDATA[<p>Hallo ich hab hier 2 Probleme (Vllt eher Verständnissprobleme).</p>
<p>Kurze umrissen, es geht um ein Strategy-Pattern das die Funktionalität des Threads kapseln soll. Das erste was ich nicht verstanden habe ist, wieso muss ich bei der &quot;friend class&quot;-Deklaration die Typen des Templates mit angeben? Bzw in meine Fall hab ich jetzt die StartInfos-Klasse auch mit TemplateParameter versehen.</p>
<p>Und beim 2ten Problem versteh ich das auftrettene Problem beim MinGW (gcc under Windows) nicht. Beim Visual C++ 2010 (unmanaged) kann ich es ohne Probleme übersetzten im Gcc kommen immer diese 4 Fehlermeldungen:</p>
<pre><code>[...]\Task.h|63|error: explicit specialization in non-namespace scope `class Task&lt;Action, Thread&gt;'|
[...]\Task.h|63|error: enclosing class templates are not explicitly specialized|
[...]\Task.h|64|error: `PrepareThread' is not a function template|
[...]\Task.h|64|error: invalid function declaration|
</code></pre>
<p>In dem unten folgenden Code entspricht die Zeile 63 der 38.</p>
<p>Und hier der Code dazu:</p>
<pre><code class="language-cpp">// Vorwaertsdeklaration
      template &lt;typename Action, typename Thread&gt;
      class Task;
      class CWinThread;
      class ThreadPool;

      // Klasse zur Zwischenspeicherung
      template &lt;typename Action, typename Thread&gt;
      class StartInfos {
            friend class Task&lt;Action, Thread&gt;; // Dies hier war das erste Problem
            friend class ThreadPool;

         private:
            StartInfos( void*f, void* p ) : _function(f), _parameter(p) {};
            void* _function;
            void* _parameter;
      };

      // Das Strategy-Pattern
      template &lt;typename Action, typename Thread&gt;
      class Task {
         public:
            Task() {}
            virtual ~Task() {}

            void operator () ( Action *action, void* param ) {
               m_Action = action;
			   Thread *w = NULL:
               PrepereThread( w, param );
            }
         protected:
         private:
            template &lt;typename W&gt;
            void PrepareThread( W* w, void* parameter ) {
               StartInfos&lt;Action, Thread&gt;* infos = new StartInfos&lt;Action, Thread&gt;( m_Action, parameter );
               W::CreateThread( StartFunctionFunc, infos );
            }
            template &lt;&gt; //Und dies hier das 2te
            void PrepareThread&lt;CWinThread&gt;( CWinThread* w, void* parameter ) {
               StartInfos&lt;Action, Thread&gt;* infos = new StartInfos&lt;Action, Thread&gt;( m_Action, parameter );
               w = AfxBeginThread( StartFunctionFuncAfx, infos )
            }

            static void StartFunctionFunc( void* param ) {
               StartInfos&lt;Action, Thread&gt;* infos = static_cast&lt;StartInfos&lt;Action, Thread&gt;*&gt;( param );
               Action&amp; action = *static_cast&lt;Action*&gt;( infos-&gt;_function );
               action( infos-&gt;_parameter );
               delete infos;
            }

            static unsigned int StartFunctionFuncAfx( void* param ) {
               StartInfos&lt;Action, Thread&gt;* infos = static_cast&lt;StartInfos&lt;Action, Thread&gt;*&gt;( param );
               Action&amp; action = *static_cast&lt;Action*&gt;( infos-&gt;_function );
               action( infos-&gt;_parameter );
               delete infos;
               return 0;
            }

            Action* m_Action;
      };
</code></pre>
<p>Vielen Dank für die Hilfe.<br />
Mfg Marco</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268203/template-probleme-bei-klassen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 00:14:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268203.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 Jun 2010 20:30:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Probleme bei Klassen on Sat, 05 Jun 2010 20:30:23 GMT]]></title><description><![CDATA[<p>Hallo ich hab hier 2 Probleme (Vllt eher Verständnissprobleme).</p>
<p>Kurze umrissen, es geht um ein Strategy-Pattern das die Funktionalität des Threads kapseln soll. Das erste was ich nicht verstanden habe ist, wieso muss ich bei der &quot;friend class&quot;-Deklaration die Typen des Templates mit angeben? Bzw in meine Fall hab ich jetzt die StartInfos-Klasse auch mit TemplateParameter versehen.</p>
<p>Und beim 2ten Problem versteh ich das auftrettene Problem beim MinGW (gcc under Windows) nicht. Beim Visual C++ 2010 (unmanaged) kann ich es ohne Probleme übersetzten im Gcc kommen immer diese 4 Fehlermeldungen:</p>
<pre><code>[...]\Task.h|63|error: explicit specialization in non-namespace scope `class Task&lt;Action, Thread&gt;'|
[...]\Task.h|63|error: enclosing class templates are not explicitly specialized|
[...]\Task.h|64|error: `PrepareThread' is not a function template|
[...]\Task.h|64|error: invalid function declaration|
</code></pre>
<p>In dem unten folgenden Code entspricht die Zeile 63 der 38.</p>
<p>Und hier der Code dazu:</p>
<pre><code class="language-cpp">// Vorwaertsdeklaration
      template &lt;typename Action, typename Thread&gt;
      class Task;
      class CWinThread;
      class ThreadPool;

      // Klasse zur Zwischenspeicherung
      template &lt;typename Action, typename Thread&gt;
      class StartInfos {
            friend class Task&lt;Action, Thread&gt;; // Dies hier war das erste Problem
            friend class ThreadPool;

         private:
            StartInfos( void*f, void* p ) : _function(f), _parameter(p) {};
            void* _function;
            void* _parameter;
      };

      // Das Strategy-Pattern
      template &lt;typename Action, typename Thread&gt;
      class Task {
         public:
            Task() {}
            virtual ~Task() {}

            void operator () ( Action *action, void* param ) {
               m_Action = action;
			   Thread *w = NULL:
               PrepereThread( w, param );
            }
         protected:
         private:
            template &lt;typename W&gt;
            void PrepareThread( W* w, void* parameter ) {
               StartInfos&lt;Action, Thread&gt;* infos = new StartInfos&lt;Action, Thread&gt;( m_Action, parameter );
               W::CreateThread( StartFunctionFunc, infos );
            }
            template &lt;&gt; //Und dies hier das 2te
            void PrepareThread&lt;CWinThread&gt;( CWinThread* w, void* parameter ) {
               StartInfos&lt;Action, Thread&gt;* infos = new StartInfos&lt;Action, Thread&gt;( m_Action, parameter );
               w = AfxBeginThread( StartFunctionFuncAfx, infos )
            }

            static void StartFunctionFunc( void* param ) {
               StartInfos&lt;Action, Thread&gt;* infos = static_cast&lt;StartInfos&lt;Action, Thread&gt;*&gt;( param );
               Action&amp; action = *static_cast&lt;Action*&gt;( infos-&gt;_function );
               action( infos-&gt;_parameter );
               delete infos;
            }

            static unsigned int StartFunctionFuncAfx( void* param ) {
               StartInfos&lt;Action, Thread&gt;* infos = static_cast&lt;StartInfos&lt;Action, Thread&gt;*&gt;( param );
               Action&amp; action = *static_cast&lt;Action*&gt;( infos-&gt;_function );
               action( infos-&gt;_parameter );
               delete infos;
               return 0;
            }

            Action* m_Action;
      };
</code></pre>
<p>Vielen Dank für die Hilfe.<br />
Mfg Marco</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907479</guid><dc:creator><![CDATA[Marc-O]]></dc:creator><pubDate>Sat, 05 Jun 2010 20:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to Template Probleme bei Klassen on Sat, 05 Jun 2010 21:12:06 GMT]]></title><description><![CDATA[<p>Marc-O schrieb:</p>
<blockquote>
<p>Das erste was ich nicht verstanden habe ist, wieso muss ich bei der &quot;friend class&quot;-Deklaration die Typen des Templates mit angeben?</p>
</blockquote>
<p>weil man nur konkrete klassen und funktionen zum friend erklären kann, nicht aber eine ganze klassen-familie.</p>
<blockquote>
<p>Und beim 2ten Problem versteh ich das auftrettene Problem beim MinGW (gcc under Windows) nicht. Beim Visual C++ 2010 (unmanaged) kann ich es ohne Probleme übersetzten im Gcc kommen immer diese 4 Fehlermeldungen:</p>
</blockquote>
<p>der c++-standard erlaubt es schlicht nicht, ein nested template zu spezialisieren, ohne die umgebenden template-parameter ebenfalls zu spezifizieren. wenn vc++2010 es erlaubt, dann ist das eine erweiterung des standards (versuch's mal mit vc++2010 und deaktivierten erweiterungen).</p>
<p>ausweg aus der situation bietet folgendes pattern:<br />
<a href="http://stackoverflow.com/questions/568046/nested-template-specialization" rel="nofollow">http://stackoverflow.com/questions/568046/nested-template-specialization</a></p>
<p>ru,<br />
cirion</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907491</guid><dc:creator><![CDATA[cirion]]></dc:creator><pubDate>Sat, 05 Jun 2010 21:12:06 GMT</pubDate></item><item><title><![CDATA[Reply to Template Probleme bei Klassen on Sun, 06 Jun 2010 10:31:04 GMT]]></title><description><![CDATA[<p>Vielen Dank.</p>
<p>Hat sehr geholfen, jetzt schaut der Code zwar sehr STL-Mässig aus aber scheint zu funktionieren <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>
<p>Mfg Marco</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907647</guid><dc:creator><![CDATA[Marc-O]]></dc:creator><pubDate>Sun, 06 Jun 2010 10:31:04 GMT</pubDate></item></channel></rss>