<?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[Zeiger auf eine Methode über typedef]]></title><description><![CDATA[<p>Ich versuche gerade, in einer ABC definierte Memberfunktionen als Parameter in einer abgeleiteten Klasse zu übergeben, finde aber keine vernünftige Lösung.<br />
gegeben:</p>
<pre><code>//WVObject.hpp
class WVObject
{
protected:
	typedef bool (*EvalFun)(unsigned long);

	bool evalA (unsigned long id) const;
	bool evalB (unsigned long id) const;

	template &lt;class T&gt;
	T getVal (EvalFun fnctToEval) const
	{
		//hier der Zugriff auf die übergebene Methode
		(*fnctToEval) (i);
	}

public:
	//...
};
</code></pre>
<pre><code>//WVKnoten.hpp
class WVKnoten : public WVObject
{
}

//WVKnoten.cpp
void WVKnoten::parse ()
{
	//...
	int res = getVal&lt;float&gt;(evalB); //hier liegt wahrscheinlich der Fehler
}
</code></pre>
<p>Wenn ich das so mache, dann sagt der Compiler</p>
<blockquote>
<p>WVKnoten.cpp(21): error C2248: &quot;WVObject::evalB&quot;: Kein Zugriff auf protected Member, dessen Deklaration in der WVObject-Klasse erfolgte.<br />
WVKnoten.cpp(21): error C2664: 'T WVObject::getVal&lt;float&gt;(const std::string &amp;,unsigned short,unsigned short,WVObject::EvalFun,bool,unsigned long) const': Konvertierung des Parameters 4 von 'bool (__thiscall WVObject::* )(const std::string &amp;,unsigned long,const std::string &amp;,const std::string &amp;) const' in 'WVObject::EvalFun' nicht möglich</p>
</blockquote>
<p>Im Internet bin ich auch nicht schlauer geworden. Was mache ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325229/zeiger-auf-eine-methode-über-typedef</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 03:29:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325229.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Apr 2014 11:23:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf eine Methode über typedef on Mon, 21 Apr 2014 13:22:11 GMT]]></title><description><![CDATA[<p>Ich versuche gerade, in einer ABC definierte Memberfunktionen als Parameter in einer abgeleiteten Klasse zu übergeben, finde aber keine vernünftige Lösung.<br />
gegeben:</p>
<pre><code>//WVObject.hpp
class WVObject
{
protected:
	typedef bool (*EvalFun)(unsigned long);

	bool evalA (unsigned long id) const;
	bool evalB (unsigned long id) const;

	template &lt;class T&gt;
	T getVal (EvalFun fnctToEval) const
	{
		//hier der Zugriff auf die übergebene Methode
		(*fnctToEval) (i);
	}

public:
	//...
};
</code></pre>
<pre><code>//WVKnoten.hpp
class WVKnoten : public WVObject
{
}

//WVKnoten.cpp
void WVKnoten::parse ()
{
	//...
	int res = getVal&lt;float&gt;(evalB); //hier liegt wahrscheinlich der Fehler
}
</code></pre>
<p>Wenn ich das so mache, dann sagt der Compiler</p>
<blockquote>
<p>WVKnoten.cpp(21): error C2248: &quot;WVObject::evalB&quot;: Kein Zugriff auf protected Member, dessen Deklaration in der WVObject-Klasse erfolgte.<br />
WVKnoten.cpp(21): error C2664: 'T WVObject::getVal&lt;float&gt;(const std::string &amp;,unsigned short,unsigned short,WVObject::EvalFun,bool,unsigned long) const': Konvertierung des Parameters 4 von 'bool (__thiscall WVObject::* )(const std::string &amp;,unsigned long,const std::string &amp;,const std::string &amp;) const' in 'WVObject::EvalFun' nicht möglich</p>
</blockquote>
<p>Im Internet bin ich auch nicht schlauer geworden. Was mache ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395657</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Mon, 21 Apr 2014 13:22:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf eine Methode über typedef on Mon, 21 Apr 2014 12:23:28 GMT]]></title><description><![CDATA[<p>[Rewind] schrieb:</p>
<blockquote>
<p>Im Internet bin ich auch nicht schlauer geworden. Was mache ich falsch?</p>
</blockquote>
<p>Du mißachtest den Thread [url=http://www.c-plusplus.net/forum/304133]Den richtigen Code posten: reduziertes compilierbares Beispiel<br />
[/url]<br />
Dann sind sowohl <code>evalA</code> , als auch <code>evalB</code> Memberfunktionen, also mitnichten vom Typ <code>EvalFun</code> .</p>
<p>Ich glaube das hier koennte eine Lösung sein.<br />
Änderungen markiert.</p>
<pre><code class="language-cpp">class gadget{
protected:
  typedef void(gadget::*fp)(); // hier
  void a(){}
  void b(){}
public:
  void func(fp p){}
};

struct widget : gadget{
  gadget g;
  void func2(){
    g.func(&amp;widget::a); // hier
  }
};

int main(){
}
</code></pre>
<p>Ich verstehe 11.4 [class.protected] dahingehend, dass der nested-name-specifier <em>widget</em> da hin muss(Z.13).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395667</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Mon, 21 Apr 2014 12:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf eine Methode über typedef on Mon, 21 Apr 2014 13:29:10 GMT]]></title><description><![CDATA[<p>Danke, aber durch die Änderungen hat sich nichts an der Ausgabe geändert.<br />
Mir ist aufgefallen, dass du die Funktion nicht über dasimplizite this, sondern über ein Objekt der Basisklasse aufrufst. Hat das irgendeine Auswirkung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395672</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Mon, 21 Apr 2014 13:29:10 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf eine Methode über typedef on Mon, 21 Apr 2014 13:46:29 GMT]]></title><description><![CDATA[<p>[Rewind] schrieb:</p>
<blockquote>
<p>Mir ist aufgefallen, dass du die Funktion nicht über dasimplizite this, sondern über ein Objekt der Basisklasse aufrufst. Hat das irgendeine Auswirkung?</p>
</blockquote>
<p>Das ist - wie geschrieben - meine Interpretation von 11.4 im C++ Standard.</p>
<blockquote>
<p>11.4 Protected member access [class.protected]<br />
1 An additional access check beyond those described earlier in Clause 11 is applied when a non-static data member or non-static member function is a protected member of its naming class (11.2)115 As described earlier, <strong>access to a protected member is granted because the reference occurs in a friend or member of some class C. If the access is to form a pointer to member (5.3.1), the nested-name-specifier shall denote C or a class derived from C.</strong> All other accesses involve a (possibly implicit) object expression (5.2.5). In this case, the class of the object expression shall be C or a class derived from C.</p>
</blockquote>
<p>[Rewind] schrieb:</p>
<blockquote>
<p>Danke, aber durch die Änderungen hat sich nichts an der Ausgabe geändert.</p>
</blockquote>
<p>Dann wäre es jetzt wirklich an der Zeit ein minimales Beispiel zu bringen. Meins scheint ja das Problem nicht widerzuspiegeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395674</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Mon, 21 Apr 2014 13:46:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf eine Methode über typedef on Mon, 21 Apr 2014 14:20:14 GMT]]></title><description><![CDATA[<p><a href="https://ideone.com/KqqNKY" rel="nofollow">https://ideone.com/KqqNKY</a><br />
Wie gesagt, das Problem könnten Zeile 7 und/oder 27 sein.</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class WVObject
{
protected:
    typedef bool (*EvalFun)(unsigned long);

    bool evalA (unsigned long id) const { return true; }
    bool evalB (unsigned long id) const { return false; }

    bool test (EvalFun fnctToEval) const
    {
        //hier der Zugriff auf die übergebene Methode
        bool res = (*fnctToEval) (4);
        return res;
    }

public:
    virtual void parse() = 0;
};

//WVKnoten.hpp
class WVKnoten : public WVObject
{
public:
	void parse () { cout &lt;&lt; test(&amp;WVObject::evalA); }
};

int main() {
	WVKnoten obj;
	obj.parse();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2395677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395677</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Mon, 21 Apr 2014 14:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf eine Methode über typedef on Mon, 21 Apr 2014 14:34:59 GMT]]></title><description><![CDATA[<pre><code>#include &lt;iostream&gt;
using namespace std;

class WVObject
{
protected:
	typedef bool ( WVObject::* EvalFun ) ( unsigned long ) const; // Das hier muss ein Zeiger auf eine Memberfunktion sein

	bool evalA ( unsigned long id ) const { return true; }
	bool evalB ( unsigned long id ) const { return false; }

	bool test ( EvalFun fnctToEval )
	{
		bool res = (this-&gt;*fnctToEval)( 4 ); // Hier muss die entsprechende Syntax verwendet werden
		return res;
	}

public:
	virtual void parse() = 0;
};

class WVKnoten : public WVObject
{
public:
	void parse () { cout &lt;&lt; test( &amp;WVKnoten::evalA ); /* Es muss WVKnoten sein*/ }
};

int main()
{
	WVKnoten obj;
	obj.parse();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2395680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395680</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 21 Apr 2014 14:34:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf eine Methode über typedef on Mon, 21 Apr 2014 18:28:25 GMT]]></title><description><![CDATA[<p>Super, Arcoth, danke! Problem gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395723</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Mon, 21 Apr 2014 18:28:25 GMT</pubDate></item></channel></rss>