当我在类中定义自定义比较函数时,我会收到错误消息:
'Solution :: myfunction':非标准语法;使用“&”创建指向成员的指针
但是,如果我在类之外定义它,则可以使用。如何在课程的内部中定义它?
ListView.seperated
谢谢
答案 0 :(得分:5)
非静态成员函数将隐式this
作为第一个参数。调用成员函数的正确方法是
Solution s;
std::vector<int> x;
s.myfunction(x,x);
当您实际需要一个仅将两个向量作为参数的函数时。将其声明为static
或使用自由功能(首选方式)。
PS:除非您需要在不同的范围内调用相同的比较函数,否则我建议使用lambda:
sort(vec.rbegin(), vec.rend(),
[](const vector<int> &i, const vector<int> &j) {
return i.front()<j.front();
}
);
答案 1 :(得分:2)
有几种解决方法:
我希望提供lambda:
sort(vec.rbegin(), vec.rend(), [](const auto &a, const auto &b)
{
return std::lexicographical_compare(a.begin(), a.end(),
b.begin(), b.end());
});
其他方法是提供比较类:
class CmpIntVectors {
public:
bool operator(const vector<int> &a, const vector<int> &b) const
{
return std::lexicographical_compare(a.begin(), a.end(),
b.begin(), b.end());
}
};
...
sort(vec.rbegin(), vec.rend(), CmpIntVectors{});
或将myfunction
设为静态。
免责声明:我假设您的vec
如下所示:
std::vector<std::vector<int>> vec;
答案 2 :(得分:1)
Lambdas是当今首选的方法,而不是定义自己的比较函数。它们更具可读性,并且可以就地显示(em),即您可以在调用sort()的地方看到代码,而不必在其他位置查看某些头文件。
答案 3 :(得分:0)
如果由于某种原因你仍然想使用类成员函数,那么使用 lambda 并将 this
传递给它:
sort(vec.rbegin(), vec.rend(), [this](const vector<int> &i, const vector<int> &j){
return this->myfunction(i, j);
});