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