templates error C2664
-
Hallo Zusammen,
ich komme hier nicht mehr weiter bekomme den Fehler:
Fehler 2 error C2664: 'Node<T>::Node(const Node<T> &)' : Konvertierung von Argument 1 von 'Medium *' in 'const Node<T> &' nicht möglich h:\dev\c++\workspace\medienverwaltung\medienverwaltung_4.0\medienverwaltung_4.0\medienverwaltung_4.0\mycontainer.h 46 1 Medienverwaltung_4.0
nachdem ich die Klasse als Template definiert habe:
Ich weis nicht was genau der Fehler ist,
liegt es evtl antemplate <class T> Node<T>::Node(T *elem, Node<T> *nextNode = NULL){ this->elem = elem; this->nextNode = nextNode; }
Muss ich dort doch 2 Templateparameter erstellen
Hier der Code dieser Klasse:
#ifndef MYCONTAINER_H #define MYCONTAINER_H #include "medien.h" using namespace std; template <class T> class MyContainer; template <class T> class Node{ T *elem; Node<T> *nextNode; friend class MyContainer<T>; public: Node<T>(T *elem, Node<T> *nextNode);//Node *nextNode = NULL Defaultwert siehe definition }; template <class T> Node<T>::Node(T *elem, Node<T> *nextNode = NULL){ this->elem = elem; this->nextNode = nextNode; } template <class T> class MyContainer{ Node<T> *interator = NULL; Node<T> *headNode = NULL; Node<T> *firstNode = NULL; public: MyContainer(); bool add(T *contentPtr); //add(elem: T*) bool remove(); void begin(); void next(); T* getItem(); //T* getItem(); Node<T>* getPredecessorNode(); };//end classprototype template <class T> MyContainer<T>::MyContainer(){ //cout << "Neuer leerer Container wurde erstellt" << endl; } //Einfügepostition immer ans Ende der Liste //Nach dem Einfügen ist Interator = 1 Node siehe begin(); template <class T> bool MyContainer<T>::add(T *elem){ try{ if (firstNode == NULL && headNode == NULL){ //erster Node des Containers firstNode = new Node<T>(elem); firstNode->elem = elem; firstNode->nextNode = NULL; headNode = firstNode; } else{ headNode->nextNode = new Node<T>(elem); headNode = headNode->nextNode; } begin(); return true; //erfolgreich } catch (bad_alloc){ cout << "Fehler bei der Speicherplatzresservierung für neuen Node" << endl; return false; } catch (...){ cout << "Unbekannter Fehler beim Hinzufügen eines neuen Nodes" << endl; return false; } } template <class T> bool MyContainer<T>::remove(){ if (interator == NULL){ return false;//Fehlermeldung => Container ist leer, keine Elemente (Nodes) vorhanden } //interator == firstNode == headNode /nur ein Element im Container vorhanden else if (interator == firstNode && headNode == firstNode){ delete interator; // oder aufruf des deconstruktors interator = NULL; headNode = NULL; firstNode = NULL; begin(); } //erstes Element löschen ABER weitere Elemente vorhanden else if (interator == firstNode && headNode != firstNode) { firstNode = interator->nextNode; delete interator; begin(); } //interator == headNode / letztes Element von mehreren else if (interator == headNode && headNode != firstNode){ headNode = getPredecessorNode(); getPredecessorNode()->nextNode = NULL; delete interator; begin(); } //Element zwischen anderen Elementen else if (interator != headNode && interator != firstNode){ getPredecessorNode()->nextNode = interator->nextNode; delete interator; begin(); } else{ return false; cout << "Unbekannter Fehler beim Löschen!" << endl << "Zur Sicherheit ihrer Daten wurde der Löschvorgang nicht durchgeführt" << endl; } return true; /*else{ //element zwischen anderen Node *tmp = firstNode; while (tmp->nextNode != NULL && tmp->nextNode != interator){ tmp = tmp->nextNode; } if (tmp == NULL){ return false; } if (interator == firstNode){ firstNode = interator->nextNode;//interator ist erstes element } else{ tmp->nextNode = interator->nextNode;//hier ist der FEHLER } delete interator; begin();//return }*/ return false; } /* Ermitteln des Vorgänger-Node (enlg. predecessor) RETURN: Pointer auf Vorgänger-Node */ template <class T> Node<T>* MyContainer<T>::getPredecessorNode(){ if (interator == firstNode){ return NULL; } Node<T> *tmp = firstNode; while (tmp->nextNode != NULL && tmp->nextNode != interator){ tmp = tmp->nextNode; } return tmp; } template <class T> void MyContainer<T>::begin(){ interator = firstNode; } template <class T> void MyContainer<T>::next(){ if (MyContainer<T>::getItem() == NULL){ return;//Fehlermeldung => Container ist leer, keine Elemente (Nodes) vorhanden } interator = interator->nextNode; } template <class T> T* MyContainer<T>::getItem(){ if (interator == NULL){ return NULL; } else{ return interator->elem; } } #endif
-
Komisch, Medium kommt gar nicht vor ...
Ist bestimmt ein Compilerfehler
-
8.3.6/6
Except for member functions of class templates, the default arguments in a member function definition that
appears outside of the class definition are added to the set of default arguments provided by the member
function declaration in the class definition. Default arguments for a member function of a class template
shall be specified on the initial declaration of the member function within the class template.