C++异常 使用类 模板 需要 模板 参数列表

C++错误 使用类 模板 需要 模板 参数列表
#ifndef _CON_
#define _CON_

template <typename T>

struct Container
{
virtual Container& push_back(const T& data) = 0;
virtual size_t size() const = 0;
virtual operator bool() const = 0;
virtual void clear() = 0;
};
#endif

#ifndef __LIST__
#define __LIST__
#include "container.h"
#include "quad.h"

typedef void (*ACCESSFUN)(QUADPTR); //定义遍历时节点处理函数类型

struct Node
{
QUADPTR data;
Node *next;
};

template <typename T>
class List : public Container<T>
{
protected :
struct Node
{
T data;
Node *next;
Node(const T& q):data(q){}
}*head,*tail;
public:
List():head(NULL),tail(NULL){}
List(const List& l):head(l.head),tail(l.tail){}
~List(){clear();}

operator bool() const {return head!=NULL;}

void clear()
{
if(head = NULL)
return ;
Node *p=head,*q= head;
while(p != NULL)
{
q = p->next;
delete p;
p = q;
}
}

List& push_back(const T& data)
{
Node *p = new Node(data);

p->next = NULL;
if(tail == NULL)
head = tail = p;
else
{
tail->next = p;
tail = p;
}

return *this;

}

List& operator = (const List& s)
{
head = s.head;
tail = s.tail;
return *this;
}

List& operator+=(const T& data)
{
push_back(data);
return *this;
}

size_t size()const
{
Node *p = head;
size_t i = 0;

while (p != NULL)
{
p = p->next;
++i;
}

return i;
}
void traverse(ACCESSFUN f)
{
Node *p = head;

while (p != NULL)
{
f(p->data);
p = p->next;
}
}


friend class listIterator;
class listIterator
{
private:
List<T>* plist;
typename List<T>::Node *p;

public:
listIterator(const List<T>& list):plist(const_cast <List<T>*>(&list)),p(list.head){}
listIterator(const listIterator& itr):plist(itr.plist),p(itr.p){}
listIterator():plist(NULL),p(NULL){}

listIterator& begin(){p = plist->List<T>::head;return *this}
listIterator end() {return listIterator();}
listIterator& operator = (const listIterator& itr){plist = itr.plist;p = itr.p;return *this;}
bool operator != (const listIterator& itr){return p!=itr.p;}
listIterator& operator ++(){p = p->next; return *this;}
T& operator *(){return p->data;}

};
};

#endif

list.cpp
无内容


int main()
{
int choose=1;int choice=0;
int a,b,c;
double answer;