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
相关产品推荐
相关产品推荐

