c++模板泛型(模板参数列表)

时间:2022-04-25 20:53:42

I am trying to implement a Circular Doubly Linked List, and I have no probably with the Linked List implementation itself. The problem I am having is allowing it to take generic parameters using templates. I have checked several tutorials dealing with templates, but I haven't found anything specific to what I am trying to do.

我正在尝试实现一个循环的双链表,我可能没有链表实现本身。我的问题是允许它使用模板使用通用参数。我已经检查了几个处理模板的教程,但是我还没有找到任何具体的内容。

I believe I have worked out most of the errors, but I am still getting the errors:

我相信我已经算出了大部分的错误,但我仍然得到错误:

linkedlist.h(37): error C2955: 'Node' : use of class template requires template argument list
linkedlist.h(9) : see declaration of 'Node'
main.cpp(6) : see reference to class template instantiation 'LinkedList<T>' being compiled
      with
      [
          T=int
      ]

Here is my code:

这是我的代码:

LinkedList.h:

LinkedList.h:

#ifndef LINKEDLIST_H
#define LINKEDLIST_H

#include <iostream>

//node
template <class T>
class Node
{
private:

public:
    bool first;             //boolean tag 
    Node * next;            //pointer to the next node
    Node * prev;            //pointer to the prev node
    T data;                 //placeholder for generic data

    Node(T d);          //constructor
};

template <class T>
Node<T>::Node(T d)
{
    next = NULL;
    prev = NULL;
    data = d;
    first = false;
}

//a circular doubly-linked list
template <class T>
class LinkedList
{
private:

public:
    Node * p;                   //reference to the current node

    LinkedList();               //constructor

    bool empty();               //returns true if the list is empty, false otherwise
    int size();                 //returns the number of elements in the list    
    void insertBefore(T d); //inserts a node before the current node
    void insertAfter(T d);  //inserts a node after the current node
    void remove();              //removes the current node
    void moveAhead();           //moves to the next node
    void moveBack();            //moves to the previous node
    T access();             //returns the data of the current node
    void listContents();        //displays the data of every element in the list starting with the current
};

template <class T>
LinkedList<T>::LinkedList()
{
    p = NULL;
}

template <class T>
bool LinkedList<T>::empty()
{
    if (p == NULL)
    {
        std::cout << "List is Empty.\n";
        return true;
    }
    else
        return false;
}

template <class T>
int LinkedList<T>::size()
{
    if (p == NULL)
    {
        return 0;
    }
    if (p->next == p)
    {
        return 1;
    }
    else
        return 2; //placeholder
}

template <class T>
void LinkedList<T>::insertBefore(T d)
{
    Node *q, *t;
    if (p == NULL)
    {
        p = new Node<T>(d);
        p->next = p;
        p->prev = p;
        //std::cout << d << " inserted.\n";
    }
    else
    {
        if (p-> next == p)
        {
            q = new Node<T>(d);
            q->next = p;
            q->prev = p;
            p->next = q;
            p->prev = q;
            //std::cout << d << " inserted.\n";
        }
        else
        {
            q = p->prev;
            t = new Node<T>(d);
            p->prev = t;
            q->next = t;
            t->next = p;
            t->prev = q;
            //std::cout << d << " inserted.\n";
        }
    }
}

template <class T>
void LinkedList<T>::insertAfter(T d)
{
    Node *q, *t;
    if (p == NULL)
    {
        p = new Node<T>(d);
        p->next = p;
        p->prev = p;
        //std::cout << d << " inserted.\n";
    }
    else
    {
        if (p-> next == p)
        {
            q = new Node<T>(d);
            q->next = p;
            q->prev = p;
            p->next = q;
            p->prev = q;
            //std::cout << d << " inserted.\n";
        }
        else
        {
            q = p->next;
            t = new Node<T>(d);
            p->next = t;
            q->prev = t;
            t->next = q;
            t->prev = p;
            //std::cout << d << " inserted.\n";
        }
    }
}

template <class T>
T LinkedList<T>::access()
{
    if (p == NULL)
    {
        std::cout << "The list is empty. No data to be accessed.\n";
        return NULL;
    }
    else
        return p->data;
}

template <class T>
void LinkedList<T>::remove()
{
    if (p == NULL)
        std::cout << "The list is empty. No node exists to be removed.\n";
}

template <class T>
void LinkedList<T>::moveAhead()
{
    p = p->next;
}

template <class T>
void LinkedList<T>::moveBack()
{
    p = p->prev;
}

template <class T>
void LinkedList<T>::listContents()
{
    if (p == NULL)
    {
        std::cout << "This list is empty, there are no elements to be displayed.";
    }
    else
    {
        Node *q;
        p->first = true;;
        q = p;
        while (!q->next->first)
        {
            //std::cout << q->data << ", ";
            q = q->next;
        }
        //std::cout << q->data << ".\n";
        p->first = false;
    }
}

#endif

main.cpp:

main.cpp:

#include <iostream>
#include "LinkedList.h"

int main()
{
    LinkedList<int> list;

    list.empty();
    std::cout << "p list size is: " << list.size() << std::endl;
    list.remove();
    list.access();
    list.insertBefore(3);
    list.insertBefore(2);
    list.moveBack();
    list.insertBefore(1);
    list.moveBack();
    list.moveAhead();
    list.moveAhead();
    list.insertAfter(5);
    list.insertAfter(4);
    list.moveBack();
    list.moveBack();
    list.listContents();

    system("PAUSE");
    return 0;
}

As far as I'm aware I haven't done much wrong, I just need to correct those few errors. If I have done something majorly wrong if you could please point it out to me, or direct me to an appropriate resource it would be much appreciated.

就我所知,我并没有做错多少,我只需要改正那几个错误。如果我做错了什么事,如果你能给我指出来,或者引导我找到合适的资源,我将不胜感激。

Thanks in advance.

提前谢谢。

1 个解决方案

#1


3  

The error is pretty clear. You are using Node in several places inside LinkedList without using it with template parameters.

错误很明显。您在LinkedList内的几个地方使用节点,而不使用模板参数。

For example:

例如:

template <class T>
void LinkedList<T>::insertBefore(T d)
{
    Node *q, *t;

Should be

应该是

template <class T>
void LinkedList<T>::insertBefore(T d)
{
    Node<T> *q, *t;

And the same goes for the other places, except inside the Node class declaration and Node function definitions (and in function definitions, you have to have it for the first one).

其他地方也是如此,除了节点类声明和节点函数定义(在函数定义中,第一个节点必须有)。

#1


3  

The error is pretty clear. You are using Node in several places inside LinkedList without using it with template parameters.

错误很明显。您在LinkedList内的几个地方使用节点,而不使用模板参数。

For example:

例如:

template <class T>
void LinkedList<T>::insertBefore(T d)
{
    Node *q, *t;

Should be

应该是

template <class T>
void LinkedList<T>::insertBefore(T d)
{
    Node<T> *q, *t;

And the same goes for the other places, except inside the Node class declaration and Node function definitions (and in function definitions, you have to have it for the first one).

其他地方也是如此,除了节点类声明和节点函数定义(在函数定义中,第一个节点必须有)。