2012-03-24 15 views
2

Ich versuche, meine eigene Vorlage für eine List-Klasse als Lernübung zu erstellen. Ich habe allerdings einige Probleme mit Template-Syntax wurde und ich bin jetzt die folgende Fehlermeldung zu erhalten ..Fehler: Template-Argument für 'struct List' erforderlich

main.cpp|Line 8|instantiated from here 
error: template argument required for 'struct List' 
In function 'int main()': 
... 

Soweit ich sagen kann ich nichts zu mißbrauchen bin aber dies ist mein erstes Mal der Arbeit mit Vorlagen und würde wirklich jemanden schätzen, der durchschaut und mich wissen lässt, was ich falsch mache.

List.hpp:

#if !defined _LIST_HPP_ 
#define _LIST_HPP_ 

#include "Node.hpp" 

///since we're creating a template everything must be defined in the hpp 

template <typename ListType> 
class List 
{ 
    public: 
     List(); 
     bool Empty(); 
     void PushFront(); 
     void PushBack(); 
     void PopBack(); 
     Node<ListType>& GetHead(); 

    private: 
     int _size; 
     Node<ListType>* _head; 
     Node<ListType>* _tail; 
}; 


///implement List class here 
template <typename ListType> 
List<ListType>::List() : _head(0), _tail(0), _size(0) 
{ 
} 
template <typename ListType> 
bool List<ListType>::Empty() 
{ 
    return _size == 0; 
} 
template <typename ListType> 
void List<ListType>::PushFront() 
{ 
    _head = new Node<ListType>(_head , 0); 
    if (!Empty()) 
     _head->_prev->_next = _head; //set previous nodes _next to new _head 

    ++_size; 
} 
template <typename ListType> 
void List<ListType>::PushBack() 
{ 
    _tail = new Node<ListType>(0 , _tail); 
    if (!Empty()) 
     _tail->_next->_prev = _tail; // set old tails _prev to new tail 

    ++_size; 
} 
template <typename ListType> 
void List<ListType>::PopBack() 
{ 

} 
template <typename ListType> 
Node<ListType>& List<ListType>::GetHead() 
{ 
    return _head; 
} 

#endif //define 

Node.hpp:

#if !defined _NODE_HPP_ 
#define _NODE_HPP_ 


template<typename NodeType> 
class Node{ 
    public: 
     Node(Node* prev = 0, Node* next = 0); 
     void SetData(NodeType newData); 
     void GetData(); 
    private: 
     friend class List; 

     NodeType _data; 
     Node* _next; 
     Node* _prev; 

}; 


///implement Node 

template <typename NodeType> 
Node<NodeType>::Node(Node* prev, Node* next) : _prev(prev), _next(next) 
{} 
template <typename NodeType> 
void Node<NodeType>::SetData(NodeType newData) 
{ 
    _data = newData; 
} 
template <typename NodeType> 
void Node<NodeType>::GetData() 
{ 
    return _data; 
} 

#endif //define 

Main.hpp

#include <iostream> 
#include "List.hpp" 
int main() 
{ 
    List<int> testl; 
     //test 
     testl.PushFront(); 
     testl.GetHead().SetData(7); //Error thrown here?? 
     std::cout << test1.GetHead().GetData() << std::endl; 

    return 0; 
} 

Antwort

5

List ist eine Klasse-Vorlage, so dass Sie es als solche deklarieren müssen in Ihrem Freund Erklärung

template<typename ListType> 
friend class List; 

Wenn Sie nur List<NodeType> möchte einen Freund sein, müssen Sie es, dass die Template-Argument sagen, so dann der Freund Erklärung wird

friend class List<NodeType>; 

Damit dies funktioniert, muss er wissen, dass List existiert als eine Klassenvorlage, so dass man es an der Spitze der Node.hpp braucht zuzukunfts zu erklären:

template<typename ListType> 
class List; 
+0

Ah Danke wäre es mir im Alter, um das herauszufinden genommen hat. Könnten Sie bitte auf Ihren dritten Punkt eingehen? Vielleicht in meinen Code einfügen? Klingt frech, aber ich habe Probleme, es kompilieren zu lassen. Wenn ich den letzten Codeabschnitt außerhalb der Node-Deklaration verwende, ist die "friend" -Syntax nicht gut, wenn ich sie in die Node-Klasse lege, steht "List ist keine Vorlage" in Bezug auf die Zeile 'friend class List ; '. Sind Sie auch sicher, dass der Typenname oben korrekt ist? Ich überprüfe einfach, wie ich schon sagte, dass ich die Template-Syntax noch nicht wirklich kenne. Wirklich zu schätzen die Antwort! – Holly

+0

Tell eine Lüge, war tatsächlich in der Lage, es zur Arbeit nur durch die erste Änderung oben genannten 'template Freund Klasse Liste;' .. etwas mehr Informationen über den letzten Teil des Beitrags kümmern, mit dem ich Probleme hatte, aber ansonsten funktioniert mein Programm wie gewünscht :) Danke !! – Holly

Verwandte Themen