<?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[Zugriffsoperator überladen]]></title><description><![CDATA[<p>Hallo <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
habe eine Templateklasse entworfen, die einen Koten in einer Baumstruktur modelliert. Diese Klasse soll als Basisklasse für Baumknoten mit erweiterten Funktionen dienen.<br />
Nun möchte ich den Zugriffsoperator -&gt; so überschreiben, dass er einen Zeiger des Typs zurück gibt, der als Templateargument angegeben wurde. Das funzt aber nicht, weil der Compiler den überladenen Operator zu ignorieren scheint. Seht selbst:</p>
<p>Der Header (LinkedTreeTemplate.h), das Template</p>
<pre><code class="language-cpp">#pragma once
#define _AFXDLL

#include &lt;afx.h&gt;
#include &lt;list&gt;
#include &lt;algorithm&gt;

template&lt;class T&gt;
class CTreeNode : public CObject
{
protected:
	/// &lt;summary&gt; The children &lt;/summary&gt;
	std::list&lt;CTreeNode*&gt; m_children;

	/// &lt;summary&gt; The parent &lt;/summary&gt;
	CTreeNode* m_parent;
public:
	CTreeNode(void) : m_parent(NULL){};

// Zugriffsoperator überschreiben
	T* operator-&gt;()
	{
		return dynamic_cast&lt;T*&gt;(this);
	}

	void AddChild(CTreeNode* pChild)
	{
...
	};

	std::list&lt;CTreeNode*&gt; GetChilds(const CRuntimeClass* pClass)
	{
...
	}

};
</code></pre>
<p>Nun die Verwendung im Beispielcode:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#define _AFXDLL
#include &lt;afx.h&gt;

using namespace System;

#include &quot;LinkedTreeTemplate.h&quot;

class ItTestTreeBase : public CTreeNode&lt;ItTestTreeBase&gt;
{
	DECLARE_DYNCREATE(ItTestTreeBase)
public:
	ItTestTreeBase () : CTreeNode() {}
	ItTestTreeBase (const ItTestTreeBase&amp; rhs) : CTreeNode(rhs){}

	virtual char* foo()
	{
		return &quot;ItTestTreeBase&quot;;
	};
};
IMPLEMENT_DYNCREATE(ItTestTreeBase, CObject)

int main(array&lt;System::String ^&gt; ^args)
{
	ItTestTreeBase root, node1, node2;
	root.AddChild(&amp;node1);
	root.AddChild(&amp;node2);
	std::list&lt;CTreeNode&lt;ItTestTreeBase&gt;*&gt; li = root.GetChilds();
	std::list&lt;CTreeNode&lt;ItTestTreeBase&gt;*&gt;::iterator itD = li.begin();
	while (itD != li.end())
	{
		CTreeNode&lt;ItTestTreeBase&gt;* tmp = *itD;
		Console::WriteLine(tmp-&gt;foo()); // Compilerfehler
		itD++;
	}
    return 0;
}
</code></pre>
<p>Der Compiler dazu:<br />
1&gt;.\IteratorTest.cpp(33) : error C2039: 'foo': Ist kein Element von 'CTreeNode&lt;T&gt;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=ItTestTreeBase<br />
1&gt; ]<br />
Hat also jemand ne Ahnung, was hier falsch läuft?<br />
Danke Euch &amp; Lg<br />
Alechseij</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/281751/zugriffsoperator-überladen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 13:57:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/281751.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Feb 2011 09:28:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zugriffsoperator überladen on Mon, 07 Feb 2011 09:28:44 GMT]]></title><description><![CDATA[<p>Hallo <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
habe eine Templateklasse entworfen, die einen Koten in einer Baumstruktur modelliert. Diese Klasse soll als Basisklasse für Baumknoten mit erweiterten Funktionen dienen.<br />
Nun möchte ich den Zugriffsoperator -&gt; so überschreiben, dass er einen Zeiger des Typs zurück gibt, der als Templateargument angegeben wurde. Das funzt aber nicht, weil der Compiler den überladenen Operator zu ignorieren scheint. Seht selbst:</p>
<p>Der Header (LinkedTreeTemplate.h), das Template</p>
<pre><code class="language-cpp">#pragma once
#define _AFXDLL

#include &lt;afx.h&gt;
#include &lt;list&gt;
#include &lt;algorithm&gt;

template&lt;class T&gt;
class CTreeNode : public CObject
{
protected:
	/// &lt;summary&gt; The children &lt;/summary&gt;
	std::list&lt;CTreeNode*&gt; m_children;

	/// &lt;summary&gt; The parent &lt;/summary&gt;
	CTreeNode* m_parent;
public:
	CTreeNode(void) : m_parent(NULL){};

// Zugriffsoperator überschreiben
	T* operator-&gt;()
	{
		return dynamic_cast&lt;T*&gt;(this);
	}

	void AddChild(CTreeNode* pChild)
	{
...
	};

	std::list&lt;CTreeNode*&gt; GetChilds(const CRuntimeClass* pClass)
	{
...
	}

};
</code></pre>
<p>Nun die Verwendung im Beispielcode:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#define _AFXDLL
#include &lt;afx.h&gt;

using namespace System;

#include &quot;LinkedTreeTemplate.h&quot;

class ItTestTreeBase : public CTreeNode&lt;ItTestTreeBase&gt;
{
	DECLARE_DYNCREATE(ItTestTreeBase)
public:
	ItTestTreeBase () : CTreeNode() {}
	ItTestTreeBase (const ItTestTreeBase&amp; rhs) : CTreeNode(rhs){}

	virtual char* foo()
	{
		return &quot;ItTestTreeBase&quot;;
	};
};
IMPLEMENT_DYNCREATE(ItTestTreeBase, CObject)

int main(array&lt;System::String ^&gt; ^args)
{
	ItTestTreeBase root, node1, node2;
	root.AddChild(&amp;node1);
	root.AddChild(&amp;node2);
	std::list&lt;CTreeNode&lt;ItTestTreeBase&gt;*&gt; li = root.GetChilds();
	std::list&lt;CTreeNode&lt;ItTestTreeBase&gt;*&gt;::iterator itD = li.begin();
	while (itD != li.end())
	{
		CTreeNode&lt;ItTestTreeBase&gt;* tmp = *itD;
		Console::WriteLine(tmp-&gt;foo()); // Compilerfehler
		itD++;
	}
    return 0;
}
</code></pre>
<p>Der Compiler dazu:<br />
1&gt;.\IteratorTest.cpp(33) : error C2039: 'foo': Ist kein Element von 'CTreeNode&lt;T&gt;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=ItTestTreeBase<br />
1&gt; ]<br />
Hat also jemand ne Ahnung, was hier falsch läuft?<br />
Danke Euch &amp; Lg<br />
Alechseij</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017687</guid><dc:creator><![CDATA[Alechseij]]></dc:creator><pubDate>Mon, 07 Feb 2011 09:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsoperator überladen on Mon, 07 Feb 2011 09:35:19 GMT]]></title><description><![CDATA[<p>Du hast den Operator für CTreeNode überladen. tmp ist aber ein CTreeNode*****.</p>
<p>Also:</p>
<pre><code class="language-cpp">(*tmp)-&gt;foo()
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2017691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017691</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 07 Feb 2011 09:35:19 GMT</pubDate></item></channel></rss>