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 an

    template <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


  • Mod

    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.


Log in to reply