我目前正在开发一个语法分析器类,它需要在代码的某个点对包含运算符信息的结构进行排序。每个运算符都有一个优先级,这是用户通过我的分析器类的公共成员函数定义的。因此,在排序时,我需要排序函数根据相应运算符的优先级对元素进行排序。我使用以下代码来比较元素:
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;
}
请注意,我必须将此函数设为静态,因为它是在类内部定义的。
事实上,我的比较函数比较类型的元素op_char
,然后我从包含类型元素的映射中检索运算符 defop_def
,其中有一个字段“优先级”。
我面临的问题是我无法使用std::sort(ops.begin(), ops.end(), std::mem_fun_ref(&parser::op_comp))
(其中 ops 是vector of op_info)
方法。我收到以下错误,这听起来很合乎逻辑:
错误:在静态成员函数中无效使用成员“parser::operators”
这是我的问题:如何强制 std::sort 使用 comp 函数来利用类的非静态成员中的元素?显然该函数应该是非静态的,但如果我不使其静态,我就无法使用它......
将运算符也设为静态,然后您就可以在 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)
查看更多示例:cplusplus.com http://www.cplusplus.com/reference/algorithm/sort/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)