Я пытаюсь реализовать простой односвязный список, чтобы понять семантику std :: shared_ptr.
Файл code.hpp указан ниже:
#ifndef CODE_HPP
#define CODE_HPP
#include <iostream>
#include <memory>
#include <cstddef>
using std::cout;
using std::endl;
using std::shared_ptr;
using std::make_shared;
template <typename T1>
class node{
public:
node(T1&);
~node();
public:
const T1& get_data ();
shared_ptr<node<T1>>& get_next ();
private:
T1& data;
shared_ptr<node<T1>> next;
};
template<typename T1,typename T2>
class list{
public:
list(T2&);
~list();
public:
void print ();
private:
shared_ptr<node<T1>> head;
shared_ptr<node<T1>> tail;
size_t sz;
};
template<typename T1> node<T1>::node(T1& r):data(r){
next = NULL;
}
template<typename T1> node<T1>::~node(){
}
template<typename T1> const T1& node<T1>::get_data(){
return data;
}
template<typename T1> shared_ptr<node<T1>>& node<T1>::get_next(){
return next;
}
template<typename T1,typename T2> list<T1,T2>::list(T2& r){
auto it = r.begin();
while(it != r.end()){
if(it == r.begin()){
head = make_shared<node<T1>>(*it);
head->get_next() = tail;
}
else{
tail = make_shared<node<T1>>(*it);
tail = tail->get_next();
}
++it;
}
tail = NULL;
sz = r.size();
}
template<typename T1,typename T2> list<T1,T2>::~list(){
}
template<typename T1, typename T2> void list<T1,T2>::print(){
auto temp = head;
while(temp){
cout << temp->get_data() << endl;
temp = temp->get_next();
}
return;
}
#endif
Ниже приведен исходный код в main.cpp:
#include "code.hpp"
#include<array>
using std::array;
int main (void)
{
array<int, 7> a{1, 2, 3, 4, 5, 6, 7};
list<int,decltype(a)> l(a);
l.print();
return 0;
}
Когда приведенный выше код компилируется и запускается, функция print()
, включенная в шаблон списка, печатает только данные, соответствующие первому узлу, то есть печатает 1. Очевидно, что узлы не связаны друг с другом.
Может ли кто-нибудь указать на логическую ошибку в коде, из-за которой не происходит связывание?