<?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[Compilererror im Zusammenhang mit Funktionspointern]]></title><description><![CDATA[<p>Ich versuche ein ganz einfahces Beispiel aus dem Buch &quot;Practical Statecharts in C / C++. Quantum Programming for Embedded Systems&quot; zu kompilieren.<br />
Der Compiler bricht mit folgender Fehlermeldung ab:</p>
<pre><code>$ gcc Qhsmtst1.cpp
Qhsmtst1.cpp: In constructor `QHsmTst::QHsmTst()':
Qhsmtst1.cpp:17: error: argument of type `void (QHsmTst::)(const QEvent*)' does
not match `void (QHsm::*)(const QEvent*)'
</code></pre>
<p>Die entsprechende Zeile in Qhsmtst1.cpp ist:</p>
<p>[cpp]class QHsmTst : public QHsm {<br />
public:<br />
<strong>QHsmTst() : QHsm((QPseudoState)initial) {} // Zeile 17</strong><br />
protected:<br />
[/cpp]</p>
<p>QPseudoState ist eine Typdefinition und wird in Qhsm.h spezifiziert:</p>
<pre><code class="language-cpp">class QHsm {                    // Quantum Hierarchical State Machine
public:
   typedef void (QHsm::*QPseudoState)(QEvent const*);  // pseudostate
   typedef QPseudoState (QHsm::*QState)(QEvent const*);      // state
</code></pre>
<p>Im Ordner in dem die ganzen Quelldateien liegen befinden sich auch einige Visual Studio Projektdateien. Das Beispiel aus dem Buch wurde also offensichtlich mit dem Microsoftcompiler (und nicht dem GCC den ich benutze) kompiliert. Ich benutze:</p>
<p>gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)</p>
<p>Kennt jemand ein Workaround für mein Problem?</p>
<p>Gruß und Segen,<br />
Christoph</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/147678/compilererror-im-zusammenhang-mit-funktionspointern</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 11:23:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/147678.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 May 2006 07:22:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Compilererror im Zusammenhang mit Funktionspointern on Fri, 19 May 2006 07:22:27 GMT]]></title><description><![CDATA[<p>Ich versuche ein ganz einfahces Beispiel aus dem Buch &quot;Practical Statecharts in C / C++. Quantum Programming for Embedded Systems&quot; zu kompilieren.<br />
Der Compiler bricht mit folgender Fehlermeldung ab:</p>
<pre><code>$ gcc Qhsmtst1.cpp
Qhsmtst1.cpp: In constructor `QHsmTst::QHsmTst()':
Qhsmtst1.cpp:17: error: argument of type `void (QHsmTst::)(const QEvent*)' does
not match `void (QHsm::*)(const QEvent*)'
</code></pre>
<p>Die entsprechende Zeile in Qhsmtst1.cpp ist:</p>
<p>[cpp]class QHsmTst : public QHsm {<br />
public:<br />
<strong>QHsmTst() : QHsm((QPseudoState)initial) {} // Zeile 17</strong><br />
protected:<br />
[/cpp]</p>
<p>QPseudoState ist eine Typdefinition und wird in Qhsm.h spezifiziert:</p>
<pre><code class="language-cpp">class QHsm {                    // Quantum Hierarchical State Machine
public:
   typedef void (QHsm::*QPseudoState)(QEvent const*);  // pseudostate
   typedef QPseudoState (QHsm::*QState)(QEvent const*);      // state
</code></pre>
<p>Im Ordner in dem die ganzen Quelldateien liegen befinden sich auch einige Visual Studio Projektdateien. Das Beispiel aus dem Buch wurde also offensichtlich mit dem Microsoftcompiler (und nicht dem GCC den ich benutze) kompiliert. Ich benutze:</p>
<p>gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)</p>
<p>Kennt jemand ein Workaround für mein Problem?</p>
<p>Gruß und Segen,<br />
Christoph</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1060607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1060607</guid><dc:creator><![CDATA[eem]]></dc:creator><pubDate>Fri, 19 May 2006 07:22:27 GMT</pubDate></item><item><title><![CDATA[Reply to Compilererror im Zusammenhang mit Funktionspointern on Fri, 19 May 2006 07:31:17 GMT]]></title><description><![CDATA[<p>Wie sieht die ganze QHsm Klasse aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1060618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1060618</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Fri, 19 May 2006 07:31:17 GMT</pubDate></item><item><title><![CDATA[Reply to Compilererror im Zusammenhang mit Funktionspointern on Fri, 19 May 2006 07:35:05 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">/////////////////////////////////////////////////////////////////////
// Quantum Hierarchical State Machine declaration (C++ version)
// Copyright (c) 2002 Miro Samek, Palo Alto, CA. 
// All Rights Reserved.
/////////////////////////////////////////////////////////////////////
#ifndef qhsm_h
#define qhsm_h

#ifndef qevent_h
   #include &quot;qevent.h&quot;
#endif

class QHsm {                    // Quantum Hierarchical State Machine
public:
   typedef void (QHsm::*QPseudoState)(QEvent const*);  // pseudostate
   typedef QPseudoState (QHsm::*QState)(QEvent const*);      // state

   void init(QEvent const *e = 0);      // execute initial transition
   void dispatch(QEvent const *e);                  // dispatch event
   int isIn(QState state);                     // &quot;is-in-state&quot; query
   static char const *getVersion();

protected:
   struct Tran {                        // protected inner class Tran
      QState myChain[7];
      unsigned short myActions;    // action mask (2-bits for action)
   };
   QHsm(QPseudoState initial);                                // ctor
   virtual ~QHsm();                                   // virtual xtor
   QPseudoState top(QEvent const*) { return 0; }   // the &quot;top&quot; state
   QState getState() const { return myState; }
   void tran(QState target);              // dynamic state transition
   void tranStat(Tran *t, QState target);  // static state transition
   void init_(QState target) { myState = target; }
   #define Q_INIT(target_) init_(Q_STATIC_CAST(QState, target_))
   #define Q_TRAN(target_) if (1) { \
      static Tran t_; \
      tranStat(&amp;t_, Q_STATIC_CAST(QState, target_));\
   } else ((void)0)
   #define Q_TRAN_DYN(target_) tran(Q_STATIC_CAST(QState, target_))

private:
   void tranSetup(Tran *t, QState target);

private:
   QState myState;                                // the active state
   QState mySource;               // source state during a transition
};
typedef QHsm::QPseudoState QSTATE;       // state-handler return type

       // helper macro to calculate static dimension of a 1-dim array
#define DIM(array_) (sizeof(array_)/sizeof(*(array_)))

#endif                                                      // qhsm_h
</code></pre>
<p>bitte nicht verklagen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1060624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1060624</guid><dc:creator><![CDATA[eem]]></dc:creator><pubDate>Fri, 19 May 2006 07:35:05 GMT</pubDate></item><item><title><![CDATA[Reply to Compilererror im Zusammenhang mit Funktionspointern on Fri, 19 May 2006 10:18:35 GMT]]></title><description><![CDATA[<p>Im Konstruktor von QHsmTst ist ein Fehler, da auf einen Klassenzeiger der (ich nehme an) Basisklasse QHsm zugegriffen wird. Leider werden Klassenzeiger nicht vererbt, d.h. es muß ein expliziter cast gemacht werden, z.B.</p>
<pre><code class="language-cpp">(void (QHsmTst::)(const QEvent*)) (pointer)
</code></pre>
<p>bzw. mittels eines Typedefs:</p>
<pre><code class="language-cpp">static_cast&lt;QHsm::QPseudoState&gt;(pointer)
</code></pre>
<p>Da sind wohl die anderen Compiler nicht Standard-C++ konform...</p>
<p>Ansonsten zeig mal den Inhalt des Konstruktors von QHsmTest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1060774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1060774</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 19 May 2006 10:18:35 GMT</pubDate></item><item><title><![CDATA[Reply to Compilererror im Zusammenhang mit Funktionspointern on Mon, 22 May 2006 09:40:31 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Danke für deine Antwort Th.</p>
<p>Das Zeiger auf QEvent wird in der Datei Qevent.h deklariert. Ist also kein Klassenpointer der in der Klasse QHsm deklariert wurde.<br />
Den Inhalt des Konstruktors QHsmtst hast du breits vor dir.</p>
<pre><code>QHsmTst() : QHsm((QPseudoState)initial) {}
</code></pre>
<p>ist ja direkt die definition des C'tors.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062613</guid><dc:creator><![CDATA[eem]]></dc:creator><pubDate>Mon, 22 May 2006 09:40:31 GMT</pubDate></item><item><title><![CDATA[Reply to Compilererror im Zusammenhang mit Funktionspointern on Mon, 22 May 2006 09:58:54 GMT]]></title><description><![CDATA[<p>Sorry, ich war so blind, daß ich das Fettgedruckte nicht gelesen habe...</p>
<p>Und ich hatte auch noch einen Tippfehler bei mir:</p>
<pre><code class="language-cpp">(void (QHsm::*)(const QEvent*)) (pointer)
</code></pre>
<p>Mit Klassenpointer meinte ich &quot;QHsm::*&quot;.</p>
<p>Aber was ist &quot;initial&quot; denn bei dir (ich nehme an eine Methode der Klasse &quot;QHsmTst&quot;)?</p>
<p>Hier mal ein Beispiel von mir, daß ich selbst mal als Test benötigt habe, um dies zu verstehen.</p>
<pre><code class="language-cpp">class A
{
public:
	typedef void (A::*MemberFunc)();

	A(MemberFunc f) { m_f = f; }

	void DoIt() { (this-&gt;*m_f)(); }

private:
	MemberFunc m_f;
};

class B : public A
{
public:
	B() : A((MemberFunc)&amp;B::bf) { x = 42; }

	void bf() { std::cout &lt;&lt; x &lt;&lt; std::endl; }

private:
	int x;
};
</code></pre>
<p>Wie du siehst, übergebe ich &quot;&amp;B::bf&quot;.<br />
Evtl. mußt du auch bei dir</p>
<pre><code class="language-cpp">QHsmTst() : QHsm((QPseudoState)&amp;HsmTst::initial) {}
</code></pre>
<p>schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062637</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 22 May 2006 09:58:54 GMT</pubDate></item><item><title><![CDATA[Reply to Compilererror im Zusammenhang mit Funktionspointern on Mon, 22 May 2006 12:09:02 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9348">@Th</a>: vielen danak. du hast mir sehr geholfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062722</guid><dc:creator><![CDATA[eem]]></dc:creator><pubDate>Mon, 22 May 2006 12:09:02 GMT</pubDate></item></channel></rss>