template liste
-
hiho hab folgendes problem:
error C2227: Links
muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.und mein zweites problem:
wie binde ich friend in Node ein ?hier der quellcode (ausschnitt)
template <typename T> class CNode{ private: T* pItem; CNode<T>* pNext; public: T* getItem(){ return pItem; } CNode<T>* getNext() { return pNext; } //friend class CList; <--- wie binde ich den ein ? CNode(){pItem = NULL; pNext = NULL;} // Konstruktur für neuen Knoten }; template<typename T> class CList{ private: CNode<T>* pHead; //Listenanfang CNode<T>* pCurrentNode; public: ... T* getItem(){ return pCurrentNode->getItem(); } //liefert Zeiger auf aktuelles objekt };mein aufruf in der main:
... CList<CObject*> Objects; ... if(Objects.getItem()->getNumbers() == sNumber); <--- fehler code 2227vielen dank schonmal
-
Zum Fehler: Besitzt denn die Klasse CObject eine Methode getNumbers()?
@friends:
CList ist keine Klasse, sondern ein Template - und du mußt schon dazusagen, welche Spezialisierung davon du als Freund haben willst:template<typename T> class CList;//Forward-Deklaration template<typename T> class CNode { ... public: friend class CList<T>; ... }; template<typename T> class CList {...};(übrigens würde ich die Node als Subklasse von CList anlegen)
-
CNode<CObject*>::getItem() und CList<CObject*>::getItem() liefern ein CObject**.
-
danke cstoll für die den friend hinweiß

die deklaration hat gefälltCStoll schrieb:
Zum Fehler: Besitzt denn die Klasse CObject eine Methode getNumbers()?
int getNumbers() const { return num; }
kann mir jemand weiterhelfen ?
-
Na dann greift wohl noch der Hinweis von MFK (den Punkt hatte ich wohl übersehen) - du bekommst einen Doppelpointer, den du auch doppelt dereferenzieren müsstest:
(*(Objekts.GetItem))->getNumbers()(alternativ könntest du die GetItem()-Methoden so umbauen, daß sie einen T& zurückgeben)
-
i'm so sry bin grad neben der kappe aber müüst heut damit fertig werden.
hab nun es so gemacht:
template <class T> class CList; template <class T> class CNode{ private: T pItem; CNode<T>* pNext; public: ... }; template<class T> class CList{ private: CNode<T>* pHead; //Listenanfang CNode<T>* pCurrentNode; public: ... bool add(T element); ... }; template <typename T> bool CList<T>::add(T element){ CNode* pNewNode; try{ pNewNode = new CNode; } catch(bad_alloc){ cout << "Fehler bei Allozierung" << endl; abort(); } pNewNode->pNext = pHead; pNewNode->pItem = element; pHead = pNewNode; return 1; }error LNK2019: Verweis auf nicht aufgelöstes externes Symbol
"public: bool __thiscall CList<class CObject *>::add(class CObject *)"i'm so sry aber was is nu los -.- ?
-
ah und der aufruf:
ObjectList.add(ptrObject);
ptrObject ist ein Zeiger
-
Stehen die Funktionen denn alle zusammen im Header? Wenn nicht, solltest du das ändern (sonst kann der Compiler die benötigten Template-Instanzen nicht zusammenbauen).
-
