学习STL我试图否定一个带有not2但是有问题的仿函数。 这是一个例子:
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
struct mystruct : binary_function<int,int,bool> {
bool operator() (int i,int j) { return i<j; }
};
template <class T>
class generatore
{
public:
generatore (T start = 0, T stp = 1) : current(start), step(stp)
{ }
T operator() () { return current+=step; }
private:
T current;
T step;
};
int main () {
vector<int> first(10);
generate(first.begin(), first.end(), generatore<int>(10,10) );
cout << "Smallest element " << *min_element(first.begin(), first.end(),mystruct() ) << endl;
cout << "Smallest element: " << *max_element(first.begin(), first.end(),not2(mystruct())) << endl;
}
最后一行代码不能用g ++编译。可能是一个愚蠢的错误,但在哪里?
答案 0 :(得分:5)
struct mystruct : binary_function<int,int,bool> {
bool operator() (int i,int j) const // add a const here
{ return i<j; }
};
原因:
在这一行:
cout << "Smallest element: " << *max_element(first.begin(), first.end(),not2(mystruct())) << endl
not2
(mystruct())将返回std::binary_negate
:
template<class AdaptableBinaryPredicate>
binary_negate<AdaptableBinaryPredicate> not2( P const& pred ) {
return binary_negate<AdaptableBinaryPredicate>(pred);
}
在std :: binary_negate中,调用操作符是const非静态成员函数
template <class AdaptableBinaryPredicate>
class binary_negate
: public binary_function
<typename AdaptableBinaryPredicate::first_argument_type
,typename AdaptableBinaryPredicate::second_argument_type
,bool>
{
AdaptableBinaryPredicate pred_;
public:
explicit binary_negate ( const AdaptableBinaryPredicate& pred )
: pred_ (pred) {} // holds the original predication
bool operator() (const typename Predicate::first_argument_type& x,
const typename Predicate::second_argument_type& y
) const // the calling operator is const
{ return !pred_(x,y); // call original predication and negate it!
// the calling operator of binary_negate is const
// so pred_ in this member has const qualify
// and the calling operator of pred_ must be const
}
};
答案 1 :(得分:4)
变化:
bool operator() (int i,int j) { return i<j; }
太:
bool operator() (int i,int j) const { return i<j; }
评论中有两个隐含的问题:
1)为什么要在方法中添加const:
您应该使用const,因为没有更改对象的成员 创建方法const正确很容易。随着const越来越多地进入你的类层次结构,在事实之后为方法添加const正确性可能变成一个真正的nighmare。
2)为什么在方法中添加const会使其编译。
not2()返回的对象的构造函数将对象的const引用作为参数。这是一种相对常见的技术,但确实要求您使用的任何方法都是const。
答案 2 :(得分:2)
mystruct operator()应如下所示:
bool operator() (int i, int j) const // note the const
答案 3 :(得分:2)
bool operator() (int i,int j) const{ return i<j; }
你的仿函数缺少const