Zugriffsoperator überladen
-
Hallo

habe eine Templateklasse entworfen, die einen Koten in einer Baumstruktur modelliert. Diese Klasse soll als Basisklasse für Baumknoten mit erweiterten Funktionen dienen.
Nun möchte ich den Zugriffsoperator -> 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:Der Header (LinkedTreeTemplate.h), das Template
#pragma once #define _AFXDLL #include <afx.h> #include <list> #include <algorithm> template<class T> class CTreeNode : public CObject { protected: /// <summary> The children </summary> std::list<CTreeNode*> m_children; /// <summary> The parent </summary> CTreeNode* m_parent; public: CTreeNode(void) : m_parent(NULL){}; // Zugriffsoperator überschreiben T* operator->() { return dynamic_cast<T*>(this); } void AddChild(CTreeNode* pChild) { ... }; std::list<CTreeNode*> GetChilds(const CRuntimeClass* pClass) { ... } };Nun die Verwendung im Beispielcode:
#include "stdafx.h" #define _AFXDLL #include <afx.h> using namespace System; #include "LinkedTreeTemplate.h" class ItTestTreeBase : public CTreeNode<ItTestTreeBase> { DECLARE_DYNCREATE(ItTestTreeBase) public: ItTestTreeBase () : CTreeNode() {} ItTestTreeBase (const ItTestTreeBase& rhs) : CTreeNode(rhs){} virtual char* foo() { return "ItTestTreeBase"; }; }; IMPLEMENT_DYNCREATE(ItTestTreeBase, CObject) int main(array<System::String ^> ^args) { ItTestTreeBase root, node1, node2; root.AddChild(&node1); root.AddChild(&node2); std::list<CTreeNode<ItTestTreeBase>*> li = root.GetChilds(); std::list<CTreeNode<ItTestTreeBase>*>::iterator itD = li.begin(); while (itD != li.end()) { CTreeNode<ItTestTreeBase>* tmp = *itD; Console::WriteLine(tmp->foo()); // Compilerfehler itD++; } return 0; }Der Compiler dazu:
1>.\IteratorTest.cpp(33) : error C2039: 'foo': Ist kein Element von 'CTreeNode<T>'
1> with
1> [
1> T=ItTestTreeBase
1> ]
Hat also jemand ne Ahnung, was hier falsch läuft?
Danke Euch & Lg
Alechseij
-
Du hast den Operator für CTreeNode überladen. tmp ist aber ein CTreeNode*****.
Also:
(*tmp)->foo()