好的,我正在创建一个使用类,模板和结构实现双链表的项目。 我经常收到错误:
doublelinklist.h(21) : error C2955: 'Node' : use of class template requires template argument list
在LinkedList类中声明节点的头部和尾部时。
DoubleLinkList.h:
#ifndef DOUBLELINKLIST_H
#define DOUBLELINKLIST_H
#ifndef NULL
#define NULL 0
#endif
//#include <stdio.h>
//#include <string>
template <class T>
struct Node
{
T val;
Node * next;
Node * prev; //both of these are self-referential data types/structures
};
template <class T>
class LinkedList
{
private:
static Node * head; //C2955
static Node * tail; //C2955
public:
bool push(T);
//bool pop();
//T at(); //C2146
//bool clear();
LinkedList()
{
/*static Node * */head = NULL;
/*static Node * */tail = NULL;
}
~LinkedList()
{}
};
#endif
DoubleLinkList.cpp
#include "DoubleLinkList.h"
template <class T>
bool LinkedList<T>::push(T pushMe)
{
Node * newN = new Node;
newN->next = NULL;
newN->prev = NULL;
if(this->head == NULL)
{
head = newN;
head->val = pushMe;
tail = newN;
printf("the value in the head is %d\n", head->val);
return true;
}
newN->prev = tail;
tail->next = newN;
newN->pushMe;
tail = newN;
printf("The value in the head is %d\n", head->val);
return true;
}
//bool LinkedList::pop(int remove_where)
//{
// Node * toRemove = at(remove_where);
//
// if(toRemove == head)
// {
// toRemove->next->prev = NULL;
// head = toRemove->next;
// }
//
// else if(toRemove = tail)
// {
// toRemove->prev->next = NULL;
// tail = toRemove->prev;
// }
//
// else
// {
// toRemove->prev->next = toRemove->next;
// toRemove->next->prev = toRemove->prev;
// }
//
// delete toRemove;
//
// return true;
//
//}
//
//T LinkedList::at()
//{
//
//
//}
//
//LinkedList::clear()
//{
//
//
//}
的main.cpp
/ *
1) Implement a Double-Linked List using templates and classes in C++.
You may use the STL type "List" as a reference.
A) Don't forget to implement a NODE class...
B) Don't forget to implement a class that is the actual list...
i) You need to have AT LEAST:
Push
Pop
At
Clear
2) Write a program that tests the functionality of your list class with the data types "int" and "std::string".
*/
#include <stdio.h>
#include <string>
#include "DoubleLinkList.h"
//template <class T>
int main()
{
int x = 5;
LinkedList<int> derp;
derp.push(x);
return 0;
}
答案 0 :(得分:4)
错误C2955(link)与需要一个类型的类型缺少类型参数列表有关。在您的代码中,您引用了Node
类型,它实际上是一个模板,需要一个类型参数列表。修复方法如下:
首先,在DoubleLinkedList.h
声明LinkedList
中(位于顶部的private:
部分):
static Node * head;
static Node * tail;
应该是(它们也不应该被声明为static
,因为我很确定每个链接列表都需要自己的头部和尾部):
Node<T> * head;
Node<T> * tail;
因为Node
实际上是模板类Node<T>
并且需要类型参数本身。
同样在DoubleLinkedList.cpp
方法的push
中:
Node * newN = new Node;
应该是:
Node<T> * newN = new Node<T>;
出于同样的原因。
此外,模板定义应在头文件中定义,并使用#include
包含头文件,例如#include "DoubleLinkedList.h"
,(并且不会按照.cpp
文件编译),因为预生成器会执行模板扩展以生成类的具体版本。最后,您在newN->pushMe;
的定义中也存在LinkedList<T>::push
的问题:不存在此类方法。修复这些问题,它有可能编译!除此之外,我不保证代码的正确性。