使用 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>>();
我正在尝试编写一个代码,它采用模板格式的数据数组,创建一个链接列表,并将 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 anotherstd::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 functionstd::shared_ptr::reset
的赋值运算符。这可能是您描述的第一个错误的原因。- 您从未将实际数据分配给
node_t
对象中的data
成员? - 你没有连接元素。你在哪里分配一个连续的元素给
head->next
? - 它基本上是一个未完成的实现,需要更多的逻辑才能工作。
Snps 给出了很好的答案。我还发现使用make_shared可以将raw ptr转换为shared ptr,如下:
tail = make_shared<node_t<T>>();