带有模板的链表:调用隐式删除的默认构造函数

时间:2016-11-22 22:35:50

标签: c++ class templates linked-list

我正在尝试编写一个链表。节点定义如下:

template<typename T>
class Node {
public:
    T value;
    Node<T> *next;
};

对于原始类型,我的链表非常有效。但是,当我尝试使用它来存储自定义类的实例时,我得到错误“调用隐式删除的Node的默认构造函数”。

我认为问题在于,当我尝试创建新节点时,我没有初始化value,这是T。但我不知道该怎么做......

template<typename T>
Node<T> *LinkedList<T>::makeNewNode(T val)
{
    Node<T> *newNode = new Node<T>;
    newNode->value = val
    newNode->next = NULL;

    return newNode;
}

2 个答案:

答案 0 :(得分:0)

虽然我不知道你的T是什么,但我认为,它不是默认构造的。在这种情况下,只需调用Node的正确拷贝构造函数:

template<typename T>
Node<T> *LinkedList<T>::makeNewNode(const T& val)
{
    return new Node<T>(val);

}

反过来要求你的Node类有一个接受T的构造函数:

template<typename T>
class Node {
public:
    T value;
    Node<T> *next;
    Node(const T& value) : value(value), next(nullptr) { }
};

答案 1 :(得分:0)

Node的构造函数应初始化value字段,例如:

template<typename T>
class Node {
    public:
        T value;
        Node<T> *next;
        Node(const T& value) : value(value), next(nullptr) { }
};

然后在调用构造函数时直接提供值:

template<typename T>
Node<T> *LinkedList<T>::makeNewNode(const T& val)
{
    Node<T> *newNode = new Node<T>(val);
    return newNode;
}