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

C++向std::vector<std::unique_ptr<VertexPuller>>push_back报错求助

解决std::vector<std::unique_ptr<VertexPuller>>的push_back报错问题

嘿,我来帮你拆解这个问题!你遇到的报错其实源于一个很容易忽略的语法细节,咱们一步步理清楚:

问题根源:std::make_unique的调用方式错误

先看你代码里的这一行:

auto vertex_puller= std::make_unique<VertexPuller>;

这里你漏掉了make_unique的调用括号()!这会导致vertex_puller的类型不是你预期的std::unique_ptr<VertexPuller>,而是指向std::unique_ptr<VertexPuller>构造函数的函数指针(具体类型是std::unique_ptr<VertexPuller>(*)())。而你的vertex_puller_tables是用来存储std::unique_ptr<VertexPuller>对象的vector,自然找不到能接受函数指针的push_back重载,所以触发了"No matching member function for call to 'push_back'"的报错。

修复后的完整代码

只需要给make_unique加上括号,正确调用它创建unique_ptr对象即可。另外我还加了一个小优化,让裸指针的转换更直观:

// 修正:添加()调用make_unique,创建真正的unique_ptr对象
auto vertex_puller = std::make_unique<VertexPuller>();
// 建议用.get()显式获取裸指针,比直接转unique_ptr更清晰
auto vp_id = reinterpret_cast<VertexPullerID>(vertex_puller.get());
vertex_puller_tables.push_back(std::move(vertex_puller));
return vp_id;

额外小提示

  • 确保VertexPullerID的定义是适合存储指针值的类型,比如using VertexPullerID = uintptr_t;,这样reinterpret_cast的行为是标准定义的,不会出现未定义行为。
  • 执行std::move之后,原vertex_puller会变成空指针,但你已经提前通过.get()获取了对象的地址,所以不会影响返回的vp_id有效性。

内容的提问来源于stack exchange,提问作者johnsulaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:42:49