我的双向链表项目出现 c2955 错误

Posted

技术标签:

【中文标题】我的双向链表项目出现 c2955 错误【英文标题】:c2955 error on my Double Link List project 【发布时间】:2010-09-23 16:35:36 【问题描述】:

好的,我正在制作一个使用类、模板和结构实现双链表的项目。 我经常收到错误:

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;    

【问题讨论】:

请发布实际错误。错误码本身是不够的。 请修正您的代码格式。 粘贴实际错误文本,修复 main.cpp 粘贴,不要定义自己的 NULL,而是包含适当的标题之一。或者更好的是,将问题简化为不需要多个短文件的独立测试用例。 【参考方案1】:

错误 C2955 (link) 与需要类型参数列表的类型缺失有关。在您的代码中,您引用了 Node 类型,它实际上是一个模板,需要一个类型参数列表。修复如下:

首先,在DoubleLinkedList.h的声明中LinkedList(在顶部的private:部分):

static Node * head;
static Node * tail;

应该是(它们也不应该被声明为static,因为我很确定每个单独的链表都需要自己的头部和尾部):

Node<T> * head;
Node<T> * tail;

因为Node 实际上是模板类Node&lt;T&gt; 并且需要类型参数本身。

DoubleLinkedList.cpp 中的push 方法类似:

Node * newN = new Node;

应该是:

Node<T> * newN = new Node<T>;

出于同样的原因。

此外,模板定义应该在头文件中定义,并且包含的​​头文件使用#include,例如#include "DoubleLinkedList.h",(而不是像 .cpp 文件那样编译)因为模板扩展以生成类的具体版本是由预处理器执行的。最后,你对LinkedList&lt;T&gt;::push的定义中newN-&gt;pushMe;也有问题:不存在这样的方法。修复这些问题,它就有可能编译!除此之外,我不保证代码的正确性。

【讨论】:

++ 我在查看错误代码的含义后怀疑是这样的。 成功了。现在我得到错误:LNK2019 和两个 LNK2001。在这里粘贴完整的细节会使一切看起来混乱。 你能总结一下错误信息吗?什么是未解析的符号名称? 对于 2019 年,它是 "public: bool __thiscall LinkedList::push(int)";对于另外两个,它是“private: static struct Node * LinkedList::tail”和“private: static struct Node * LinkedList::head” 它肯定在我的项目中。我真的必须在某处#include DoubleLinkedList.cpp 吗?

以上是关于我的双向链表项目出现 c2955 错误的主要内容,如果未能解决你的问题,请参考以下文章

双向链表插入分段错误 - C

双端链表和双向链表的区别

C语言实现双向链表

Java实现双向链表的基本操作

创建一个双向链表。初始化前 15 个节点

当我尝试从双向链表中删除最后一个元素时,为啥会收到“信号 SIGSEGV,分段错误”?