如何在初始化std::unique_ptr<std::queue<std::unique_ptr<std::string>>>时添加元素
初始化包含元素的
std::unique_ptr<std::queue<std::unique_ptr<std::string>>> 错误代码与编译报错
用户尝试的代码:
#include <iostream> #include <queue> #include <memory> #include <string> int main() { // Create a unique pointer to a queue of unique pointers to strings std::unique_ptr<std::queue<std::unique_ptr<std::string>>> _queue = std::make_unique<std::queue<std::unique_ptr<std::string>>>( std::queue<std::unique_ptr<std::string>>(std::make_unique<std::string>("Hello")) ); return 0; }
编译错误信息:
main.cpp: In function ‘int main()’: main.cpp:10:92: error: no matching function for call to ‘std::queue > >::queue(std::_MakeUniq >::__single_object)’ 10 | std::queue<std::unique_ptr<std::string>>(std::make_unique<std::string>("Hello")) | ^ In file included from /usr/include/c++/11/queue:64, from main.cpp:2: /usr/include/c++/11/bits/stl_queue.h:195:9: note: candidate: ‘template std::queue<_Tp, _Sequence>::queue(std::queue<_Tp, _Sequence>&&, const _Alloc&) [with _Alloc = _Alloc; _Requires = _Requires; _Tp = std::unique_ptr >; _Sequence = std::deque >, std::allocator > > > >]’ 195 | queue(queue&& __q, const _Alloc& __a) | ^~~~~ /usr/include/c++/11/bits/stl_queue.h:195:9: note: template argument deduction/substitution failed: main.cpp:10:92: note: candidate expects 2 arguments, 1 provided 10 | std::queue<std::unique_ptr<std::string>>(std::make_unique<std::string>("Hello")) | ^ In file included from /usr/include/c++/11/queue:64, from main.cpp:2: /usr/include/c++/11/bits/stl_queue.h:191:9: note: candidate: ‘template std::queue<_Tp, _Sequence>::queue(const std::queue<_Tp, _Sequence>&, const _Alloc&) [with _Alloc = _Alloc; _Requires = _Requires; _Tp = std::unique_ptr >; _Sequence = std::deque >, std::allocator > > > >]’ 191 | queue(const queue& __q, const _Alloc& __a) | ^~~~~ /usr/include/c++/11/bits/stl_queue.h:191:9: note: template argument deduction/substitution failed: main.cpp:10:92: note: candidate expects 2 arguments, 1 provided 10 | std::queue<std::unique_ptr<std::string>>(std::make_unique<std::string>("Hello")) | ^ In file included from /usr/include/c++/11/queue:64,
错误原因
std::queue没有接受单个std::unique_ptr<std::string>的构造函数,直接用智能指针构造队列不符合队列的构造规则。另外std::unique_ptr是不可拷贝类型,初始化队列时需要通过std::move转移所有权。
正确实现方法
方法1:先构造队列并添加元素,再转移给unique_ptr
#include <iostream> #include <queue> #include <memory> #include <string> int main() { std::queue<std::unique_ptr<std::string>> temp_queue; temp_queue.push(std::make_unique<std::string>("Hello")); std::unique_ptr<std::queue<std::unique_ptr<std::string>>> _queue = std::make_unique<std::queue<std::unique_ptr<std::string>>>(std::move(temp_queue)); // 验证元素存在 if (!_queue->empty()) { std::cout << *(_queue->front()) << std::endl; } return 0; }
方法2:使用初始化列表(通过std::move转移所有权)
#include <iostream> #include <queue> #include <memory> #include <string> int main() { std::unique_ptr<std::queue<std::unique_ptr<std::string>>> _queue = std::make_unique<std::queue<std::unique_ptr<std::string>>>( std::initializer_list<std::unique_ptr<std::string>>{ std::move(std::make_unique<std::string>("Hello")), std::move(std::make_unique<std::string>("World")) // 可添加多个元素 } ); // 验证元素 while (!_queue->empty()) { std::cout << *(_queue->front()) << " "; _queue->pop(); } return 0; }
方法3:创建unique_ptr后直接向队列添加元素
#include <iostream> #include <queue> #include <memory> #include <string> int main() { std::unique_ptr<std::queue<std::unique_ptr<std::string>>> _queue = std::make_unique<std::queue<std::unique_ptr<std::string>>>(); // 直接向队列添加元素 _queue->emplace(std::make_unique<std::string>("Hello")); _queue->push(std::make_unique<std::string>("World")); // 验证 if (!_queue->empty()) { std::cout << *(_queue->front()) << std::endl; } return 0; }
内容的提问来源于stack exchange,提问作者Qwe Qwe
相关产品推荐
相关产品推荐

