0

我对 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(const T &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:\users\jaysen\documents\data structures\lab 2\lab 2\mylist_tpt.h(184): error C2512: 'mylist<T>::node' : no appropriate default constructor available
1>          with
1>          [
1>              T=std::string
1>          ]
1>          c:\users\jaysen\documents\data structures\lab 2\lab 2\mylist_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:\users\jaysen\documents\data structures\lab 2\lab 2\mylist_main.cpp(20) : see reference to class template instantiation 'mylist<T>' being compiled
1>          with
1>          [
1>              T=std::string
1>          ]

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

4

2 回答 2

0
node* current, prev;

应该:

node *current, *prev;

正如你写的那样,它prev不是一个指针。这是一个node.

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

于 2013-02-11T10:44:32.943 回答
0

错误在这一行:

node* current, prev;

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

node *current, *prev;
于 2013-02-11T10:45:31.910 回答