gpt4 book ai didi

将函数传递给 remove_if 时出现 C++ 编译错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:48 25 4
gpt4 key购买 nike

这是我的代码片段。


void RoutingProtocolImpl::removeAllInfinity()
{
dv.erase(std::remove_if(dv.begin(), dv.end(), hasInfCost), dv.end());
}

bool RoutingProtocolImpl::hasInfCost(RoutingProtocolImpl::dv_entry *entry)
{
if (entry->link_cost == INFINITY_COST)
{
free(entry);
return true;
}
else
{
return false;
}
}

编译时出现以下错误:


RoutingProtocolImpl.cc:368: error: argument of type <code>bool (RoutingProtocolImpl::)(RoutingProtocolImpl::dv_entry*)' does not match</code>bool (RoutingProtocolImpl::<em>)(RoutingProtocolImpl::dv_entry</em>)'

最佳答案

问题

您的谓词 RoutingProtocolImpl::hasInfoCost() 是一个成员函数。 STL 算法是愚蠢的,因为它们只能处理感觉像常规函数的东西。所有将操作或谓词作为参数的 STL 算法都像调用函数一样调用它们:

op();

这适用于函数对象、指向常规函数的指针和指向静态成员的指针。对于引用对象的成员函数(在算法外部作用域的堆栈上创建的对象)或指向对象的指针的成员函数,该函数采用一个对象来调用:

obj.mf();   // reference member function
pobj->mf(); // pointer member function

现在,要解决这个问题,您有多种选择。

免费功能选项

将成员函数转换为自由函数。如果函数需要在某个对象的上下文中工作,则将该对象作为额外参数传递:

bool hasInfCost(RoutingProtocolImpl::dv_entry *entry,
const RoutingProtocolImpl& o);

然后,当您将此函数作为引用传递给 STL 算法时,您将必须绑定(bind)对象参数:

for_each(cont.begin(), cont.end(),
bind2nd(hasInfoCost, RoutingProtocolImpl());

静态成员选项

更改成员函数,使其成为静态成员函数。然后,您可以使用 RoutingProtocolImpl::hasInfoCost 传递对它的引用。让函数接受封装类类型的额外参数是没有意义的。如果它需要在对象的上下文中工作,那么它不应该是静态的:要么将其转换为自由函数(绑定(bind)到 RoutingProtocolImpl 可见性约束,从而促进代码中的解耦);或采用 Binder 和适配器方法。

绑定(bind)器和适配器选项

使用 STL 中的绑定(bind)器和适配器将您的成员函数调整为 STL 算法可以使用的东西:

dv.erase(remove_if(dv.begin(), dv.end(),
bind1st(mem_fun(&RoutingProtocolImpl::hasInfCost),
this)),
dv.end());

这个选项可以说是所有选项中最灵活的。除了对算法的调用之外,您无需更改代码中的任何内容。唯一的缺点是,对算法的调用对于外行人来说现在看起来有些模糊。

如果您选择此路径,请确保您的 const 正确性正确:如果成员函数不需要更改对象,则将其标记为 const 函数。这样您就可以使用传递给算法的临时对象和常量对象来调用它。

关于将函数传递给 remove_if 时出现 C++ 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642671/

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