шаблоны — C ++ Нет Конструктор по умолчанию? Попытка создать метод вставки для LinkedList

Я действительно новичок в 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;
}

Я пытаюсь создать новую функцию, вставьте (const T &Элем, без знака я). Его назначение описано в комментарии следующего кода:

// 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>          ]

Заранее спасибо за любую помощь, которую вы можете оказать мне!

0

Решение

Ошибка в этой строке:

node* current, prev;

Это заявляет current быть указатель на node а также prev быть экземпляр node. Деклараторы любят *, & или же [] применяется только к одному идентификатору каждый раз. Вот почему лучше размещать их рядом с идентификатором, а не с типом:

node *current, *prev;
0

Другие решения

node* current, prev;

Должно быть:

node *current, *prev;

Как вы написали это, prev не указатель Это был node,

И, как указано в ошибке, нет способа построить node сюда. (Требуется два параметра)

0

По вопросам рекламы [email protected]