Einfaches Template Problem



  • Hallo,

    Ich programmiere selten in C++ und kenn mich mit Templates kaum aus.
    Deshalb versuche ich mich dort weiterzubilden.
    Ich hatte diesen Code in einem Beispiel zu Templates gefunden

    template<class ItemType>
    void Insert(NodeType<ItemType>*& listPtr, ItemType item)
    {
      if (listPtr == NULL || item < listPtr->info)
      {
        // Save current pointer.
        NodeType<ItemType>* tempPtr = listPtr;
        // Get a new node.
        listPtr = new NodeType<ItemType>;
        listPtr->info = item;
        listPtr->next = tempPtr;
      }
      else Insert(listPtr->next, item);
    }
    

    Es kompiliert aber nicht, wenn ich es in diesem Programm verwende:

    #include <iostream>
    
    using namespace std;
    
    template<class ItemType>
    void Insert(NodeType<ItemType>*& listPtr, ItemType item)
    {
      if (listPtr == NULL || item < listPtr->info)
      {
        // Save current pointer.
        NodeType<ItemType>* tempPtr = listPtr;
        // Get a new node.
        listPtr = new NodeType<ItemType>;
        listPtr->info = item;
        listPtr->next = tempPtr;
      }
      else Insert(listPtr->next, item);
    }
    
    struct A {
        int info;
        A  *next;
    };
    
    int main() {
       A *b=new A;
       A *c=new A;
       c->info=3;
       b->info=2;
       Insert(b, 3);
       cout << b->info << " - " << b->next->info << endl;
    
    }
    

    Ich habe vermutet, dass der Code fehlerhaft ist. Ich kann mir z.B. nicht erklären was NodeType<ItemType> im Funktionskopf bedeuten soll.

    Hab den Code dann umgeschrieben und jetzt funktioniert es

    template<class ItemType, class NodeType>
    void Insert(NodeType *& listPtr, ItemType item)
    {
      if (listPtr == NULL || item < listPtr->info)
      {
        // Save current pointer.
        NodeType * tempPtr = listPtr;
        // Get a new node.
        listPtr = new NodeType;
        listPtr->info = item;
        listPtr->next = tempPtr;
      }
      else Insert(listPtr->next, item);
    }
    

    Ich frag mich jetzt ob der ursprüngliche Code wirklich fehlerhaft war oder ob ich ihn nur falsch verwendet habe.



  • Also ich vermute jetzt in dem Quellcode fehlte nur die Definition von NodeType

    template<class ItemType>
    class NodeType {
        public:
        ItemType info;
        NodeType *next;
    };
    

Log in to reply