模板链表类的复制构造函数错误:调用“Node<int”没有匹配函数>::Node()'

Copy Constructor Error With a Template Linked List Class : no matching function for call to 'Node<int>::Node()'

提问人:Ayden Cabral 提问时间:3/9/2022 最后编辑:Remy LebeauAyden Cabral 更新时间:3/9/2022 访问量:154

问:

我正在尝试为链表制作一个复制构造函数,但我不确定如何修复此错误,并且我一直在寻找几个小时。错误是:

没有用于调用“Node::Node()”的匹配函数

代码如下:

template <class T>
class Node      //node is the name of class, not specific
{
public:
    T data;     //t data allows for any type of variable
    Node *next;     //pointer to a node

    Node(T Data)    //assign data value
    {
        data = Data;    //makes data = NV parameter
        next = nullptr; //makes next = to nullptr
    }
};

template <class T>
class LinkedList
{
private:
    Node<T> * head, *tail;      //// typedef Node* head // -- head = Node* --   //// typedef Node* nodePtr =  Node* ////
public:
    LinkedList()        //constructor for Linked List
    {
        head =  nullptr;
        tail = nullptr;
    }

    LinkedList(LinkedList& copy)
    {
        head = nullptr;
        tail = nullptr;
        Node<T>* Curr = copy.head;


        while(Curr) //while not at end of list
               {
                   //val = copyHead->data;
                   Node<T>* newCpy = new Node<T>;
                   newCpy->data = Curr->data;
                   newCpy->next = nullptr;

                   if(head == nullptr)
                       {
                           head = tail = newCpy;
                       }
                   else
                       {
                           tail->next = newCpy;
                           tail = newCpy;
                       }

               }

    }
       ~LinkedList()
       {
           while (head)
            {
                Node<T>* tmp = head;
                head = head->next;
                delete(tmp);
            }
            head = nullptr;
       }
C++ 复制构造函数 定义 default-constructor

评论

0赞 Pete Becker 3/9/2022
new Node<T>使用 的默认构造函数 ,并且没有。Node<T>

答:

3赞 Vlad from Moscow 3/9/2022 #1

类 Node 没有默认构造函数。它只有以下构造函数

Node(T Data)    //assign data value
{
    data = Data;    //makes data = NV parameter
    next = nullptr; //makes next = to nullptr
}

在这份声明中

Node<T>* newCpy = new Node<T>;

使用了不存在的默认构造函数。

至少不是这三个说法

//val = copyHead->data;
Node<T>* newCpy = new Node<T>;
newCpy->data = Curr->data;
newCpy->next = nullptr;

你需要写

//val = copyHead->data;
Node<T>* newCpy = new Node<T>( Curr->data );

在 while 循环中注意这一点

while(Curr)
{
    //...
}

指针不会更改。因此,如果不是空指针,则循环是无限的CurrCurr

看来你忘了插入这句话

Curr = Curr->next;

在循环的闭合大括号之前。

评论

0赞 Ayden Cabral 3/9/2022
我感谢所有的帮助,并实现了你所说的,但是 Node 的默认构造函数会是什么样子?我是构造函数的新手
0赞 Vlad from Moscow 3/9/2022
@AydenCabral我在回答中展示了如何在没有默认构造函数的情况下使用类 Node。
0赞 Ayden Cabral 3/9/2022
好的,非常感谢您的帮助!