为什么我得到错误,模板参数需要'结构节点'

Why I am getting error, template argument required for ‘struct node’?

本文关键字:节点 结构 参数 错误 为什么      更新时间:2023-10-16

我写了下面的代码在c++中实现链表。但我得到的错误编译它。我认为问题在于模板的使用。

#include<iostream>
template<class T>
struct node{
    T data;
    struct node *next;
};
template<class T>
void push(struct node **headRef ,T data){
    struct node *temp =(struct node*) malloc(sizeof(struct node));
    temp->data=data;
    temp->next=*headRef;
    *headRef=temp;
}
int main(){
    struct node *ll = NULL;
    push(&ll,10);
    push(&ll,3);
    push(&ll,6);
    push(&ll,8);
    push(&ll,13);
    push(&ll,12);
}
误差

MsLL.cpp:9:18: error: template argument required for ‘struct node’
MsLL.cpp: In function ‘void push(int**, T)’:
MsLL.cpp:10:8: error: template argument required for ‘struct node’
MsLL.cpp:10:19: error: invalid type in declaration before ‘=’ token
MsLL.cpp:10:28: error: template argument required for ‘struct node’
MsLL.cpp:10:28: error: template argument required for ‘struct node’
MsLL.cpp:10:21: error: expected primary-expression before ‘struct’
MsLL.cpp:10:21: error: expected ‘)’ before ‘struct’
MsLL.cpp:11:7: error: request for member ‘data’ in ‘temp->’, which is of non-class type ‘int’
MsLL.cpp:12:7: error: request for member ‘next’ in ‘temp->’, which is of non-class type ‘int’
MsLL.cpp: In function ‘int main()’:
MsLL.cpp:16:8: error: template argument required for ‘struct node’
MsLL.cpp:16:17: error: invalid type in declaration before ‘=’ token
struct node *ll = NULL;

无效。你必须使用模板实例化语法。

struct node<int> *ll = NULL;

同样,您必须在push中使用模板参数。

template<class T>
void push(struct node<T> **headRef ,T data){
    struct node<T> *temp =(struct node<T>*) malloc(sizeof(struct node<T>));

一般性改进建议

  1. 您不需要使用struct node<T>。您可以只使用node<T>
  2. 最好使用new代替malloc (delete代替free)。

类模板可以更新为:

template<class T>
struct node{
    T data;
    node *next;
};

main

node<int> *ll = NULL;

In push:

template<class T>
void push(node<T> **headRef ,T data){
    node<T> *temp = new node<T>();

在你写node的所有地方,你需要添加模板参数。

template<class T>
struct node 
{
    T data;
    struct node *next;
};
template<class T>
void push(struct node<T> **headRef ,T data){
    struct node<T> *temp =(struct node<T>*) malloc(sizeof(struct node<T>));
    temp->data=data;
    temp->next=*headRef;
    *headRef=temp;
}

您还应该使用new而不是malloc来确保构造函数在对象上运行,使用malloc可能会给您带来麻烦,因为它只分配了一块内存,并且不知道任何关于构造函数的信息。一般规则:在c++代码中尽量不要使用malloc