当我从下面的代码中调用build
函数时,出现以下编译错误:
error C3867: 'SuffixArray::cmp': function call missing argument list; use '&SuffixArray::cmp' to create a pointer to member
error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided
这是我的代码:
class A{
private:
std::string text;
std::vector<int> array;
bool cmp(int a, int b) {
return std::lexicographical_compare(text.begin() + a, text.end(),
text.begin() + b, text.end());
}
void build(const std::string &str, std::vector<int> &vec) {
// Some vector values actions.
std::sort(vec.begin(), vec.end(), cmp);
}
};
这里有什么问题?我正在使用Visual C ++编译器。
答案 0 :(得分:3)
您的比较函数A::cmp
是A
的非静态成员。因此,它需要三个参数:除了显式声明的两个参数之外,它还使用指向A
的指针成为隐式可用的this
。它还有一个与普通函数指针不同的类型:bool (A::)(int, int)
在通过值传递时衰减为bool (A::*)(int, int)
。
然而,您可以std::bind()
将您的函数用于合适的对象:
std::sort(vec.begin(), vec.end(),
std::bind(&A::cmp, this, std::placeholders::_1, std::placeholders::_2));
答案 1 :(得分:0)
@DietmarKühl的回答很好地说明了为什么您的代码无法编译。 但是自C++11起,您也可以使用lambda expression来代替定义比较函数或使其固定为静态:
#include <vector>
#include <algorithm>
class A{
private:
std::string text;
std::vector<int> array;
void build(const std::string &str, std::vector<int> &vec) {
// Some vector values actions.
std::sort(vec.begin(), vec.end(), [this](int a, int b) {
return std::lexicographical_compare(text.begin() + a, text.end(),
text.begin() + b, text.end());
});
}
};
为了能够访问lambda表达式中的类成员text
,我捕获了this
指针。
但是,如果您想要捕获this
的替代方法,请查看this answer。