C++ 双链接列表:编译类错误

C++ 双链接列表:编译类错误,c++,list,C++,List,我有个问题。 我用C++编写了一个短列表程序,使用模板。(根据MCVE,我编写了部分代码来重现错误) #包括 使用名称空间std; 模板类节点{ 受保护的: H*值; 节点*next,*prev; 公众: 节点(H*值){ 该->值=NULL; 如果(值) 此->值=新的H(*值); next=prev=NULL; } 节点(H值,节点*下一个){ 该->值=NULL; 如果(值) 此->值=新的H(*值); 这个->下一个=下一个; prev=NULL; } void setPrev(节点*

我有个问题。 我用C++编写了一个短列表程序,使用模板。(根据MCVE,我编写了部分代码来重现错误)

#包括
使用名称空间std;
模板类节点{
受保护的:
H*值;
节点*next,*prev;
公众:
节点(H*值){
该->值=NULL;
如果(值)
此->值=新的H(*值);
next=prev=NULL;
}
节点(H值,节点*下一个){
该->值=NULL;
如果(值)
此->值=新的H(*值);
这个->下一个=下一个;
prev=NULL;
} 
void setPrev(节点*prev){
此->上一个=上一个;
}
}
模板类DoubleLinkedList{
私人:
节点*头,*尾;
公众:
DoubleLinkedList(){
last=新节点(空);
head=新节点(空,最后一个);
last->setPrev(头部);
}
};
int main(){
DoubleLinkedList*列表=新的DoubleLinkedList();
返回0;
}
然而,当我试图编译它时,我得到了一个编译类模板错误,标记了DoubleLinkedList类的构造函数方法的行

我错在哪里

谢谢

当我获取您当前的代码并将Node(H值,Node*next)更改为Node(H*value,Node*next)时,代码可以编译并正确运行(尚未测试)。示例:ideone.com/iag5wX–user4581301


除此之外,您还应尝试用一些英文错误消息再现错误。你可以这样做,例如使用C++标准的在线编译器,比如英语,比它需要的要好。不要链接到解释问题所需的文件。链接会腐烂,当链接腐烂时,问题就变得毫无用处了。将文件最小化到编译和演示问题(再次)所需的程度,然后将它们直接添加到问题中。最小化显示的代码的好处在于,当您达到最小代码时,您很可能已经暴露了问题并知道如何解决它。警告:在
中,void Inserisci(Nodo*temp,H val)
H val
是传递值。这意味着它是一个副本,仅在此函数调用中有效<代码>节点*n=新节点(&val,temp,temp->getNext())将指向此本地副本的指针存储在链接列表中,链接列表将比函数调用更有效,从而产生所谓的悬空指针。指向不再有效的内存位置的指针。啊。但函数似乎不接受指针,这可能是您的问题所在。强烈建议不要使用
H*值
您几乎肯定不希望
成为指针,并且在极少数情况下,您会希望
H
中提供的类型应该是
指针
。避免动态分配内存,除非有什么事情迫使您这样做。
#include <iostream>
using namespace std;

template <typename H> class Node{
protected:
  H *value;
  Node<H> *next, *prev;
public:
  Node(H *value) {
    this->value = NULL;
    if (value)
        this->value = new H(*value);
    next = prev = NULL;
}
Node(H value, Node<H> *next) {
    this->value = NULL;
    if (value)
        this->value = new H(*value);
    this->next = next;
    prev = NULL;
} 

 void setPrev(Node<H> *prev) {
    this->prev = prev;
  }
 }

template <typename H>class DoubleLinkedList {
private:
Node<H> *head, *last;
public:
 DoubleLinkedList() {
    last = new Node<H>(NULL);
    head = new Node<H>(NULL, last);
    last->setPrev(head);
}

};

int main() {
   DoubleLinkedList<int> *list = new DoubleLinkedList<int>();
   return 0;
 }