C++没有默认构造函数?正在尝试为LinkedList创建Insert方法

C++ No Default Constructor? Trying to Create Insert Method for LinkedList

本文关键字:LinkedList 创建 方法 Insert 默认 构造函数 C++      更新时间:2023-10-16

我真的是C++的新手,在使insert()函数与LinkedList一起工作时遇到了问题。这是我得到的代码,从开始

#include <iostream>
#include <cassert>
#include <stdexcept>
using namespace std;
template<typename T> class mylist;
template<typename T>
ostream& operator<< (ostream &out, const mylist<T> &l);
template <typename T>
class mylist {
public:
    // node definition
    struct node {
        T data;
        node* next_ptr;
        // node constructor
        node(const T &d, node* n):data(d),next_ptr(n){}
    };
    // alternative node definition
    /*
    class node {
    public:
        T data;
        node* next_ptr;
        // node constructor
        node(const T&d, node* n):data(d),next_ptr(n){}
    };
    */
    // linked list head pointer
    node* head_ptr;
    //friend ostream& operator<<  <>(ostream& out, const mylist<T>&l);
    friend ostream& operator<< (ostream &out, const mylist<T> &l);
public:
    // default constructor
    mylist():head_ptr(nullptr) {} // head_ptr points nowhere
    // adds element to the front of the linked list
    void push_front(const T &elem) {
        head_ptr = new node(elem, head_ptr);
    }
    // check if linked list is empty
    bool empty() { return head_ptr == nullptr;}
    // number of nodes in linked list
    unsigned size() { return length();}
    unsigned length() {
        unsigned l = 0;
        for(node* current = head_ptr; current != nullptr; current = current->next_ptr) {
            ++l;
        }
        return l;
    }
    // copy constructor
    mylist(const mylist &other)
    {   
        for(node* current_other = other.head_ptr;
            current_other != nullptr;
            current_other = current_other->next_ptr) {
                this.push_back(current_other->data); // inefficient, but easy :)
        }
    }
    // destructor
    ~mylist() {
        node* tmp;
        for(node* current = head_ptr; 
                current != nullptr; 
                current = tmp) {
            tmp=current->next_ptr;
            delete current;
        }
    }
    // at accessor method (returns the element at the ith position in the linked list)
    T& at(unsigned i){
        unsigned l=0;
        node* current;
        for(current = head_ptr; current != nullptr; current = current->next_ptr) {
            if(l == i)
                break;
            ++l;
        }
        if (current == nullptr)
            throw out_of_range("index i is out of range");
        else
            return current->data;
    }   
    // bracket operator (returns the element at the ith position in the linked list)
    T& operator[](unsigned i){
        return at(i);
    }   
    // adds element to the end of the linked list
    void push_back(const T &elem) {
        if(empty()) {
            push_front(elem);
            return;
        }
        node* last_ptr;
        for(last_ptr = head_ptr; last_ptr->next_ptr != nullptr; 
            last_ptr = last_ptr->next_ptr);
        last_ptr->next_ptr = new node(elem, nullptr);
    }
    // prints the contents of the linked list
    void print_all(void) {
        cout << "mylist{";
        for(node* current_ptr = head_ptr;  
                current_ptr != nullptr; 
                current_ptr = current_ptr->next_ptr){
            cout << current_ptr->data << " ";
        }
        cout << "}" << endl;
    }

我正在尝试创建一个新函数insert(constT&elem,unsigned I)。以下代码的注释中描述了它的用途:

// inserts the element at position i in linked list.
    // throws out of range error if position i not in list.
    void insert (const T &elem, unsigned i) {
        unsigned l=0;
        node* current, prev;
        for(current = head_ptr; current != nullptr; current = current->next_ptr) {
            if(l == i)
                break;
            ++l;
            prev = current;
        }
        if (current == nullptr)
            throw out_of_range("index i is out of range");
        else
        {
            prev->next_ptr = new Node (elem, current);
        }
    }

我的问题是,我得到了以下错误,我不知道如何修复它,或者它意味着什么:

1>c:usersjaysendocumentsdata structureslab 2lab 2mylist_tpt.h(184): error C2512: 'mylist<T>::node' : no appropriate default constructor available
1>          with
1>          [
1>              T=std::string
1>          ]
1>          c:usersjaysendocumentsdata structureslab 2lab 2mylist_tpt.h(182) : while compiling class template member function 'void mylist<T>::insert(const T &,unsigned int)'
1>          with
1>          [
1>              T=std::string
1>          ]
1>          c:usersjaysendocumentsdata structureslab 2lab 2mylist_main.cpp(20) : see reference to class template instantiation 'mylist<T>' being compiled
1>          with
1>          [
1>              T=std::string
1>          ]

提前感谢你能给我的任何帮助!

错误在这一行:

node* current, prev;

这将current声明为指向node指针,prev声明为node实例。像*&[]这样的声明器每次只应用于一个标识符。这就是为什么最好把它们放在标识符旁边,而不是放在类型旁边:

node *current, *prev;
node* current, prev;

应为:

node *current, *prev;

正如您所写的,prev不是一个指针。这是一个node

正如错误所说,没有办法以这种方式构建node。(需要两个参数)