我正在尝试编写一个代码,该代码以模板格式获取数据数组,生成链表并将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>)))'
这里有什么解决方案?提前致谢!
答案 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>>();