C++函子和列表模板

C++ functor and list template

本文关键字:列表 C++      更新时间:2023-10-16

我已经实现了一个列表和迭代器模板,find方法应该接收一个函子,所以我声明并实现了它,但我一直得到错误,没有这样的对象!"对const findBond类型的对象的调用没有匹配函数"

下面是find方法的实现:

template <class T>
template <class Predicate>
Iterator<T> List<T> :: find(const Predicate &predicate) {
    for (Iterator<T> iterator=begin(); iterator != end(); ++iterator) {
        if (predicate(*iterator)) {
            return iterator;
        }
    }
    return end();
}
// predicate is a functor that is supposed to return a boolean value

这是函数对象:

class findBond{
    Bond& bond;
public:
    findBond( Bond& bond1) : bond(bond1) {}
    bool operator() (Bond& bond1){
            return bond==bond1;
            }
};

我试着在这里使用它们:

void InvestmentBroker :: addBond(const string& name, double value, int amount ){
    Bond bond = *new Bond(name, value, amount);
    if (bondsDatabase.find(findBond(bond)) != bondsDatabase.end()) {
        //throw an exception
    } else { 
       // insert bond to dataBase
    }
}

我包含了所需的文件,所以这与包含无关

怎么了?我在这里错过了什么?

您的find方法将const Predicate&作为其参数。这意味着您只能调用谓词的const方法。但是,您的函子的调用运算符并没有声明为const。您可以通过如下声明const来解决问题:

bool operator() (Bond& bond1) const {/* do stuff */ }

声明末尾的const意味着您不能从函数中修改this,这反过来意味着您可以在const对象上调用该函数。

对我来说,这似乎是一个常量问题——大多数参数的findBond应该是const

findBond更改为此

class findBond{
    const  Bond& bond;
public:
    findBond( const Bond& bond1) : bond(bond1) {}
    bool operator() const ( const Bond& bond1){
         return bond==bond1;
    }
};