所以我正在编写一本关于使用SFML和C ++ 11进行游戏开发的书,并且用于创建场景树的代码行之一给我带来了麻烦,这在我看来有点过头了。由于find_if算法中unique_ptr的隐式删除的复制构造函数,编译器返回错误。
这是find_if调用的函数。 Ptr是std::unique_ptr<SceneNode>
的typedef。这是我目前使用find_if的唯一地方。
SceneNode::Ptr SceneNode::detachChild(const SceneNode& node) {
auto found = std::find_if(mChildren.begin(), mChildren.end(), [&] (Ptr p) -> bool { return p.get() == &node; });
assert(found != mChildren.end());
Ptr result = std::move(*found);
result->mParent = nullptr;
mChildren.erase(found);
return result;
}
返回的错误在算法本身中提出,并且特别是“调用'Ptr'的隐式删除的复制构造函数。”
Call to implicitly deleted copy constructor in LLVM有一个相关问题,但答案在我的案例中没有多大意义。
作为一个注释,我正在使用最新的Xcode 5版本进行开发。
答案 0 :(得分:2)
find_if
调用中的lambda表达式通过 value 获取Ptr
(又名unique_ptr<SceneNode>
)参数,这意味着它正在尝试复制unique_ptr
; unique_ptr
是不可复制的,因此是错误。
将lambda表达式更改为以下内容:
[&] (Ptr const& p) -> bool { return p.get() == &node; }
// ^^^^^^
// take the argument by reference and avoid copying