我试图将一个原始指针实现替换为智能指针,所以在这个函数中调用
int id = std::stoi(idToken->second);
auto newNode = std::find_if(_nodes.begin(), _nodes.end(), [&id](GraphNode *node) { return node->GetID() == id; });
我试图将原始指针(GraphNode(更改为GraphNode唯一ptr,以将GraphNode的独占所有权设置为它所声明的类,因此在它的声明中,我更改为
typedef std::unique_ptr<GraphNode> GraphNodeUniquePtr;
std::vector<GraphNodeUniquePtr> _nodes;
在函数调用中,我放入
int id = std::stoi(idToken->second);
auto newNode = std::find_if(_nodes.begin(), _nodes.end(), [&id](GraphNodeUniquePtr node){ return node.get()->GetID() == id; });
编译时,编译器抛出错误
error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = GraphNode; _Dp = std::default_delete<GraphNode>]’
然后我想可以制作一个id为的唯一指针,并使用之类的移动函数将其传递给lambda
int id = std::stoi(idToken->second);
std::unique_ptr<int> idPtr;
*idPtr = id;
auto newNode = std::find_if(_nodes.begin(), _nodes.end(), [idPtr = std::move(idPtr)](GraphNodeUniquePtr node){ return node.get()->GetID() == *idPtr.get(); });
现在编译器又给了我一个错误:
error: use of deleted function ‘ChatLogic::LoadAnswerGraphFromFile(std::string)::<lambda(ChatLogic::GraphNodeUniquePtr)>::<lambda>(const ChatLogic::LoadAnswerGraphFromFile(std::string)::<lambda(ChatLogic::GraphNodeUniquePtr)>&)’
所以我尝试了其他方法,我明白为什么它不起作用,而这两种方法我都不明白为什么它没有起作用。我想在GraphNode上创建一个共享指针,但这样我就失去了的独家所有权
如何将此原始指针实现调整为唯一指针?
感谢
不能通过复制传递std::unique_ptr
。您可以使用参考:
[&id](const GraphNodeUniquePtr& node){ return node->GetID() == id; });
或者,与适用于两个版本的const auto&
[&id](const auto& node){ return node->GetID() == id; });