Clé*_*ent 1 c++ sorting static class functor
我目前正在开发一个语法分析器类,在代码的某个点上,需要对包含运算符信息的结构进行排序.每个运算符都有一个优先级,用户通过我的分析器类的公共成员函数定义.因此,在排序时,我需要我的排序功能来根据相应运算符的优先级对元素进行排序.我正在使用以下代码来比较元素:
bool parser::op_comp(const op_info& o1, const op_info& o2) {
op_def& op1 = operators[o1.op_char];
op_def& op2 = operators[o2.op_char];
return op1.priority > op2.priority;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我必须将此函数设置为静态,因为它是在类中定义的.
事实上,我的比较函数比较了类型的元素op_char,我从包含类型元素的地图中检索运算符def,该元素op_def具有字段"priority".
我面临的问题是我无法使用std::sort(ops.begin(), ops.end(), std::mem_fun_ref(&parser::op_comp))(其中ops是一种vector of op_info)方法.我得到以下错误,这听起来很合乎逻辑:
错误:在静态成员函数中无效使用成员`parser :: operators'
这是我的问题:如何强制std :: sort使用comp函数,该函数使用来自类的非静态成员的元素?显然这个函数应该是非静态的,但如果我不使它静态的话,我就无法使用它...
提前感谢您的帮助,CFP.
使运算符也是静态的,您将能够在op_comp中使用它.
或者,使用函子代替函数:
class myCompareClass {
public:
bool operator() (
const op_info& o1, const op_info& o2) {
op_def& op1 = operators[o1.op_char];
op_def& op2 = operators[o2.op_char];
return op1.priority > op2.priority;
}
private:
... operators ...
} myCompareObject;
std::sort(ops.begin(), ops.end(), myCompareObject)
Run Code Online (Sandbox Code Playgroud)
在cplusplus.com上查看更多示例