我已经实现了一个列表和迭代器模板,find 方法应该接收一个仿函数,所以我声明并实现了一个仿函数,但我一直收到没有这样一个对象的错误! “没有匹配函数来调用 const findBond 类型的对象”
下面是查找方法的实现:
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
}
}
我包含了所需的文件,所以这与包含无关
怎么了?我在这里错过了什么?
最佳答案
您的查找方法将 const Predicate&
作为其参数。这意味着您只能调用谓词的 const
方法。但是,您的仿函数的调用运算符未声明为 const
。您可以通过像这样声明 const
来解决您的问题:
bool operator() (Bond& bond1) const {/* do stuff */ }
声明末尾的 const
意味着您不能在函数内修改 this
,这反过来意味着您可以在 const
对象。
关于C++ 仿函数和列表模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31106205/