【问题标题】:linked list with template: call to implicitly-deleted default constructor带模板的链表:调用隐式删除的默认构造函数
【发布时间】:2016-11-22 22:35:50
【问题描述】:

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

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;
}

【问题讨论】:

    标签: c++ class templates linked-list


    【解决方案1】:

    虽然我不知道您的 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) { }
    };
    

    【讨论】:

    • 这是否意味着我的 T 必须有一个复制构造函数?
    • @ahhhhhjulie,是的。
    【解决方案2】:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-11
      • 2020-11-02
      • 2022-01-22
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2017-09-10
      相关资源
      最近更新 更多