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

时间:2015-01-20 00:02:17

标签: c++ shared-ptr heap-memory

我正在尝试编写一个代码,该代码以模板格式获取数据数组,生成链表并将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>)))' 

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

2 个答案:

答案 0 :(得分:1)

我建议您使用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的赋值运算符需要另一个std::shared_ptr作为参数。您不能通过使用原始指针(括号实际上使其成为表达式)来替换内部指针,而是使用成员函数std::shared_ptr::reset。这可能是您描述的第一个错误的原因。
  • 您永远不会将实际数据分配给data对象中的node_t成员吗?
  • 您没有连接元素。您在哪里将连续元素分配给head->next
  • 它基本上是一个未完成的实现,需要更多逻辑才能工作。

答案 1 :(得分:0)

Snps有一个很好的答案。我还发现使用make_shared可以将原始ptr转换为共享ptr,如下所示:

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