You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:53:27