使用 shared_ptr 和 new 运算符创建列表

creating a list using shared_ptr and new operator

我正在尝试编写一个代码,它采用模板格式的数据数组,创建一个链接列表,并将 returns 和 shared_ptr 放在列表的头部。这是我的代码,后面是编译器错误消息:

template <typename T> 
struct node_t{
     T data; 
     shared_ptr<node<T>> next;  
}
template <typename T> 
shared_ptr<node_t<T>> make_list(T data[], int size){
      shared_ptr<node_t<T>> head = nullptr, tail = nullptr;  
      for(int i=0;i<size;i++){
          head? tail = (new node_t<T>): head = (new node_t<T>); 
          tail = tail->next;  
      }
      tail->next = nullptr; 
      return head;  
}

编译器错误是:

error: no match for 'operator=' in 'head = (operator new(12u),   
(<statement>, ((node_t<int>*)<anonymous>)))' 

这里的解决方案是什么?提前致谢!

我可以建议您改用 C++ 标准库中的 std::list 吗?

template <typename InputIt>
auto make_list(InputIt first, InputIt last) {
    return std::list<typename std::iterator_traits<InputIt>::value_type>{first, last};
}

用法:

int arr[] = {1, 2, 3, 4, 5};
auto list = make_list(std::begin(arr), std::end(arr));
auto head = std::begin(list);

如果您想出于学习目的推出自己的实现,那么您当前的代码存在许多问题。

  • std::shared_ptr takes another std::shared_ptr for argument. You can't replace the internal pointer by assigning with a raw pointer (the parentheses actually make it an expression), instead use member function std::shared_ptr::reset的赋值运算符。这可能是您描述的第一个错误的原因。
  • 您从未将实际数据分配给 node_t 对象中的 data 成员?
  • 你没有连接元素。你在哪里分配一个连续的元素给head->next?
  • 它基本上是一个未完成的实现,需要更多的逻辑才能工作。

Snps 给出了很好的答案。我还发现使用make_shared可以将raw ptr转换为shared ptr,如下:

tail = make_shared<node_t<T>>();