问题 无效使用非静态成员函数[重复]


这个问题在这里已有答案:


2581
2018-03-26 19:06


起源

为什么这个函数不是静态的? - chris
哪一个?我不允许更改函数Count()的声明 - Nash


答案:


你必须做 Foo::comparator 静态或包装在一个 std::mem_fun 类对象。这是因为lower_bounds要求比较器是一个具有调用操作符的对象类,如函数指针或函子对象。此外,如果您使用的是C ++ 11或更高版本,您也可以这样做 dwcanillas 建议并使用lambda函数。 C ++ 11也有 std::bind 太。

例子:

// Binding:
std::lower_bounds(first, last, value, std::bind(&Foo::comparitor, this, _1, _2));
// Lambda:
std::lower_bounds(first, last, value, [](const Bar & first, const Bar & second) { return ...; });

5
2018-03-26 19:12



别客气。我会说比较函数是静态的,因为它不访问类。 - Matthew Holder


最简单的解决方法是使比较器功能保持静态:

static int comparator (const Bar & first, const Bar & second);
^^^^^^

在调用时 Count,它的名字将是 Foo::comparator

你现在拥有它的方式,成为非静态成员函数是没有意义的,因为它不使用任何成员变量 Foo

另一个选择是使它成为非成员函数,特别是如果有意义的话,这个比较器可能被其他代码使用 Foo


7
2018-03-26 19:54





你应该通过一个 this 指向函数的指针,因为它依赖于它而不是a static 会员功能。


1
2018-03-26 19:14