当我尝试使用结构模板作为拒绝时,为什么会出现以下错误? 我想用C++模拟java中的链表,用链表作为我的考试的一种学习方法。

当我尝试使用结构模板作为拒绝时,为什么会出现以下错误? 我想用C++模拟java中的链表,用链表作为我的考试的一种学习方法。,c++,visual-studio,templates,struct,linked-list,C++,Visual Studio,Templates,Struct,Linked List,这是我到目前为止写的 这是头文件 #ifndef ArrayList_H #define ArrayList_H #include "ArrayListNode.h" template<class T> class ArrayList { private: ArrayListNode<T>* head; int length; public: ~ArrayList(); //Destructor. ArrayList();

这是我到目前为止写的

这是头文件

#ifndef ArrayList_H
#define ArrayList_H
#include "ArrayListNode.h"
template<class T>
class ArrayList
{
private:
    ArrayListNode<T>* head;
    int length;

public:
    ~ArrayList();        //Destructor.
    ArrayList();         //Constructor.
    void add(T);        //Append an element at the last position.
    void display(); //Display all element in the list.
    void remove(int);   //Remove element at specify index
    void clear();       //Remove all the elements from the list.
    T get(int);         //Return the element at the specified position.
    bool isEmpty();     //Return true if this list contains no elements.
    int size();         //Return the length of the list.

};
#endif
\ifndef ArrayList\u H
#定义数组列表
#包括“ArrayListNode.h”
模板
类数组列表
{
私人:
ArrayListNode*头;
整数长度;
公众:
~ArrayList();//析构函数。
ArrayList();//构造函数。
void add(T);//在最后一个位置追加一个元素。
void display();//显示列表中的所有元素。
void remove(int);//删除指定索引处的元素
void clear();//从列表中删除所有元素。
T get(int);//返回指定位置的元素。
bool isEmpty();//如果此列表不包含任何元素,则返回true。
int size();//返回列表的长度。
};
#恩迪夫
现在,这是实现文件:

template<class T>
ArrayList<T>::ArrayList()
{
    head = nullptr;
    length = 0;
}

template<class T>
ArrayList<T>::~ArrayList()
{
    ArrayListNode<T>* traverse = head;
    ArrayListNode<T>* nextNode;

    while (traverse != nullptr)
    {
        nextNode = traverse->next;
        delete traverse;
        traverse = nextNode;
    }
}

template<class T>
void ArrayList<T>::add(T item)
{
    if (head == nullptr)
    {
        head = new ArrayListNode;
        head->item = item;
        head->next = nullptr;
    }
    else
    {
        ArrayListNode<T>* traverse = head;  
        ArrayListNode<T>* newNode = new ArrayListNode;
        newNode->item = item;
        newNode->next = nullptr;

        //Find the last node in the list
        while (traverse->next)
        {
            traverse = traverse->next;
        }
        traverse->next = newNode;
    }
}

template<class T>
void ArrayList<T>::display()
{
    if (head == nullptr)
        return;
    else
    {
        ArrayListNode<T>* traverse = head;
        while (traverse->next)
        {
            cout<< traverse->item << endl;
            traverse = traverse->next;
        }
    }
}
template<class T>
void ArrayList<T> ::remove(int index)
{

}
template<class T>
void ArrayList<T>::clear()
{

}
template<class T>
T ArrayList<T>::get(int index)
{

    return;
}

template<class T>
bool ArrayList<T>::isEmpty()
{

}
template<class T>
int ArrayList<T>::size()
{
    return length;
}
模板
ArrayList::ArrayList()
{
水头=零PTR;
长度=0;
}
模板
ArrayList::~ArrayList()
{
ArrayListNode*导线=头部;
ArrayListNode*nextNode;
while(遍历!=nullptr)
{
nextNode=遍历->下一步;
删除导线;
遍历=下一个节点;
}
}
模板
void ArrayList::添加(T项)
{
if(head==nullptr)
{
head=新的ArrayListNode;
标题->项目=项目;
head->next=nullptr;
}
其他的
{
ArrayListNode*导线=头部;
ArrayListNode*newNode=新建ArrayListNode;
新建节点->项目=项目;
newNode->next=nullptr;
//查找列表中的最后一个节点
while(遍历->下一步)
{
遍历=遍历->下一步;
}
遍历->下一步=新节点;
}
}
模板
void ArrayList::display()
{
if(head==nullptr)
返回;
其他的
{
ArrayListNode*导线=头部;
while(遍历->下一步)
{
接下来是库蒂坦;
}
}
}
模板
void ArrayList::remove(int索引)
{
}
模板
void ArrayList::clear()
{
}
模板
T ArrayList::get(int索引)
{
返回;
}
模板
bool ArrayList::isEmpty()
{
}
模板
int-ArrayList::size()
{
返回长度;
}
到目前为止。。。我只创建了构造函数、析构函数和display来显示列表中的项。我还创建了add函数来追加项 在最后一个位置。其他方法都是空的。但是我从add函数得到一个错误

这是类的结构

template<class T>
struct ArrayListNode
{
    T item;                 //To hold any data.
    ArrayListNode<T>* next; //To point to the next node
};
#include <iostream>
#include "ArrayList.h"
#include "ArrayList.cpp"
using namespace std;
int main()
{
    ArrayList<int> list;

    list.add(5);
    list.display();

    return 0;
}
模板
结构ArrayListNode
{
T item;//保存任何数据。
ArrayListNode*next;//指向下一个节点
};
这是本课程的主要内容

template<class T>
struct ArrayListNode
{
    T item;                 //To hold any data.
    ArrayListNode<T>* next; //To point to the next node
};
#include <iostream>
#include "ArrayList.h"
#include "ArrayList.cpp"
using namespace std;
int main()
{
    ArrayList<int> list;

    list.add(5);
    list.display();

    return 0;
}
#包括
#包括“ArrayList.h”
#包括“ArrayList.cpp”
使用名称空间std;
int main()
{
数组列表;
增加(5);
list.display();
返回0;
}
现在,当我在没有add函数的情况下编译程序时,它会正确编译。然而,一旦我调用add函数,我会得到以下错误

c:\users\julio\documents\visual studio 2017\projects\arraylist\arraylist.cpp(31): error C2955: 'ArrayListNode': use of class template requires template argument list
1>c:\users\julio\documents\visual studio 2017\projects\arraylist\arraylistnode.h(5): note: see declaration of 'ArrayListNode'
1>c:\users\julio\documents\visual studio 2017\projects\arraylist\arraylist.cpp(28): note: while compiling class template member function 'void ArrayList<int>::add(T)'
1>        with
1>        [
1>            T=int
1>        ]
1>c:\users\julio\documents\visual studio 2017\projects\arraylist\main.cpp(9): note: see reference to function template instantiation 'void ArrayList<int>::add(T)' being compiled
1>        with
1>        [
1>            T=int
1>        ]
1>c:\users\julio\documents\visual studio 2017\projects\arraylist\main.cpp(7): note: see reference to class template instantiation 'ArrayList<int>' being compiled
1>c:\users\julio\documents\visual studio 2017\projects\arraylist\arraylist.cpp(31): error C2512: 'ArrayListNode': no appropriate default constructor available
1>c:\users\julio\documents\visual studio 2017\projects\arraylist\arraylist.cpp(38): error C2512: 'ArrayListNode': no appropriate default constructor available
c:\users\julio\documents\visual studio 2017\projects\arraylist\arraylist.cpp(31):错误C2955:“arraylist节点”:使用类模板需要模板参数列表
1> c:\users\julio\documents\visualstudio 2017\projects\arraylist\arraylistnode.h(5):注意:请参见“arraylistnode”的声明
1> c:\users\julio\documents\visual studio 2017\projects\arraylist\arraylist.cpp(28):注意:编译类模板成员函数“void arraylist::add(T)”时
1> 与
1>        [
1> T=int
1>        ]
1> c:\users\julio\documents\visualstudio 2017\projects\arraylist\main.cpp(9):注意:请参阅正在编译的函数模板实例化“void arraylist::add(T)”的参考
1> 与
1>        [
1> T=int
1>        ]
1> c:\users\julio\documents\visual studio 2017\projects\arraylist\main.cpp(7):注意:请参阅正在编译的类模板实例化“arraylist”的参考
1> c:\users\julio\documents\visual studio 2017\projects\arraylist\arraylist.cpp(31):错误C2512:“arraylist节点”:没有合适的默认构造函数可用
1> c:\users\julio\documents\visual studio 2017\projects\arraylist\arraylist.cpp(38):错误C2512:“arraylist节点”:没有合适的默认构造函数可用

head=newarraylistnode
缺少模板参数。你也应该读一下三法则。@DanielJour是的,我知道三法则。。你需要复制构造函数、析构函数,并重载赋值运算符=@ Daieljou-Hi,我不需要它,因为我有一个条件,如果它是NULL,则创建新节点,否则,添加一个新节点。“使用链表模拟C++中的java的ARAYLIST”-你想通过在C++中编写一些完全无关的代码来研究java集合类吗?为什么?如果您想学习Java集合类,那么一定要使用Java。比较java集合类和C++容器类是徒劳的,因为典型C++容器(标准的以及你自己制作的)拥有他们的内容,而java集合存储指向其所有者可以共享的内容的指针。@ ChristianHackl,我只想用链表来实践…下一个考试是用C++连接链表,因为我已经知道了java,我想做一些操作,比如Add、Cube、Delphi和一些ON。碰巧我喜欢ArrayList这个名字,并且从ArrayList类中得到了一些方法的名字。