0

我正在尝试在课堂上使用问题中提供的解决方案。我在类中使用了带有谓词函数的“remove_if”。

    void classname::function1()
    {
    vector<NeighborPoint> neighbors;
    ....
    neighbors.erase(std::remove_if(neighbors.begin(),neighbors.end(),&classname::cannotMoveIn), neighbors.end()); 
    ...
    }

    bool classname::cannotMoveIn(NeighborPoint mp)
    {
        return !mp.inGridNotOccupied;
    }

如果该代码不在类中并且谓词不是成员函数,则该代码将起作用。但是,现在我收到很长的错误消息,我猜这些错误消息是指 remove_if 模板与谓词参数不兼容(一个错误包括:错误 C2064:术语不计算为采用 1 个参数的函数)。

注意:代码旨在删除代理无法进入的相邻网格单元(在 8 个可能的单元中)。

有谁知道出了什么问题?

4

2 回答 2

1

使用std::bind

neighbors.erase(std::remove_if(neighbors.begin(),neighbors.end(),std::bind(&classname::cannotMoveIn, this, std::placeholders::_1)), neighbors.end());

此外,正如@Als 指出的那样,您的classname::cannotMoveIn方法将 aMoorePoint作为参数,而您的向量包含NeighborPoint. 请注意,即使这些类是相关的,您也会对向量的对象进行切片(因为您是按值获取参数)。

我相信您的方法应该具有以下签名:

bool classname::cannotMoveIn(const NeighborPoint &mp) const;
于 2012-06-07T02:38:44.527 回答
1

如果该代码不在类中并且谓词不是成员函数,则该代码将起作用。

当然。实例方法不像全局函数;它需要一个额外的隐藏参数this(调用它的对象)。但似乎您根本不​​需要在函数中使用当前对象。你为什么首先把它变成一个实例方法?

如果您不需要使用this,那么您可以做的一件事就是使其成为静态方法(这就像一个常规函数,除了范围)。然后你可以像以前一样传递它,就像一个普通函数一样。比谓词函数更好的是使用函数对象(你必须定义一个仿函数类,如果你不想将它移出类,它甚至可以是一个嵌套类)或 lambda(如果你有 C ++11),这将允许将谓词内联到删除算法中,因此比每次都必须调用函数指针更快。

于 2012-06-07T18:41:04.423 回答