gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:50:43 30 4
gpt4 key购买 nike

我正在尝试实现循环双重链接列表,但与链接列表实现本身无关。我遇到的问题是允许它使用模板使用通用参数。我已经查看了一些有关模板的教程,但是还没有找到我想要做的事情。

我相信我已经解决了大多数错误,但是仍然出现错误:

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
]

这是我的代码:

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:
#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;
}

据我所知,我并没有做错太多,我只需要更正那些错误即可。如果我能做的主要是错误的事情,请您向我指出,或将我引导到适当的资源,我们将不胜感激。

提前致谢。

最佳答案

错误非常明显。您正在Node内的多个位置使用LinkedList,而未将其与模板参数一起使用。

例如:

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

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

其他地方也一样,除了 Node类声明和 Node函数定义内部(在函数定义中,第一个必须具有它)。

关于c++ - C++模板泛型(模板参数列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966447/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com