关于基于模板兑现的链表为什么编译通不过

关于基于模板实现的链表为什么编译通不过啊
#include <iostream>
#include <string>
using namespace std;
template<class T>
class List{
private:
struct node{
T data;
node* next;
}*head,*tail;
public:
List(){
head=tail=NULL;
}
~List(){
node* curr=head,*p;
while (curr!=NULL)
{
p=curr;
curr=curr->next;
delete p;
}
head=tail=NULL;
}
void inserthead(T *item){
node *p;
p=new node;
p->next=head;
p->data=*item;
head=p;
if(tail==NULL)
tail=p;
}
void inserttail(T * item){
node *p;
p=new node;
p->next=NULL;
p->data=*item;
if(head==NULL)
head=tail=p;
else
tail=p;
}
T get(){
T temp;
node *p=head;
temp=head->data;
if(head==tail)
head=tail=NULL;
else
head=head->next;
delete p;
return temp;
}
};

class Person{
private:
string name;
int score;
public:
Person(string n,int s):name(n),score(s){}
void show(){
cout<<"name is "<<name<<"/n"<<"score is "<<score<<endl;
}
};

void main()
{
Person p1("ldh",90),p2("lm",80),p3("lj",60);
List<int> l;
List<Person> lis=List<Person>();
lis.inserthead(&p1);
lis.inserthead(&p2);
lis.inserttail(&p3);
Person p=lis.get();
p.show();
}

------解决方案--------------------
这段代码看的真心别扭,

List(){
head=tail=NULL;
}
~List(){
node* curr=head,*p;
while (curr!=NULL)
{
p=curr;
curr=curr->next;
delete p;
}
head=tail=NULL;
}

------解决方案--------------------
报错很清楚啊,struct node没写构造函数
	
struct node{
    node(){};
    T data;
    node* next;