gpt4 book ai didi

c++从 vector 中删除自定义对象:std::remove_if':找不到匹配的重载函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:10 25 4
gpt4 key购买 nike

在我的项目中有一个 vector

 std::vector<std::shared_ptr<MovingEntity>>gameObjects;

如果元素符合条件,我想从中删除元素。

删除元素的方法:

void GameWorld::catchBees()
{
auto q = std::remove_if(bees.begin(), bees.end(), beeToClose);
bees.erase(q);
}

方法 beeToClose:

bool GameWorld::beeToClose( const MovingEntity & bee)
{
std::shared_ptr<Beekeeper> keeper = std::static_pointer_cast<Beekeeper>(m_beekeeper);
if (bee.getConstPosition().distanceTo(m_beekeeper->getPosition()) > keeper->getCatchDistance())
{
return true;
}

return false;
}

当我尝试编译代码时,出现了一些我试图理解的错误:

'GameWorld::beeToClose': non-standard syntax; use '&' to create a pointer

不确定为什么会给出此消息

'std::remove_if': no matching overloaded function found

我没有声明 beeToClose 对吗?

'q': cannot be used before it is initialized SDLFramework

q 未初始化,因为:

std::remove_if(bees.begin(), bees.end(), beeToClose);

运行不正确?

如何在满足某些条件时正确地从 vector 中正确删除 std::shared_ptr?

最佳答案

构成成员函数指针的语法是&ClassName::FunctionName。因此,您需要 &GameWorld::beeToClose 作为指向 beeToClose 成员函数的指针。在您的情况下,您应该使用 lambda 从中调用该函数

auto q = std::remove_if(bees.begin(), bees.end(),
[&](shared_ptr<MovingEntity> const& bee){ return beeToClose(bee); });

还有,你用错了vector::erase重载,您需要删除一系列元素的重载,而不是删除单个元素的重载。

bees.erase(q, bees.end());

关于c++从 vector 中删除自定义对象:std::remove_if':找不到匹配的重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41233488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com