使用成员函数作为比较器进行问题排序
尝试编译以下代码时出现此编译错误,我该怎么办?
ISO C++ 禁止获取地址 不合格的或带括号的 非静态成员函数形成 指向成员函数的指针。
class MyClass {
int * arr;
// other member variables
MyClass() { arr = new int[someSize]; }
doCompare( const int & i1, const int & i2 ) { // use some member variables }
doSort() { std::sort(arr,arr+someSize, &doCompare); }
};
trying to compile the following code I get this compile error, what can I do?
ISO C++ forbids taking the address of
an unqualified or parenthesized
non-static member function to form a
pointer to member function.
class MyClass {
int * arr;
// other member variables
MyClass() { arr = new int[someSize]; }
doCompare( const int & i1, const int & i2 ) { // use some member variables }
doSort() { std::sort(arr,arr+someSize, &doCompare); }
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
doCompare
必须是静态
。如果doCompare
需要来自MyClass
的数据,您可以通过将MyClass
转换为比较函子,方法是将:更改为
并调用:
另外,不是
doSort 缺少返回值?
我认为应该可以使用 std::mem_fun 和某种绑定将成员函数变成自由函数,但目前我无法理解确切的语法。
编辑: Doh,
std::sort
按值获取函数,这可能是一个问题。为了解决这个问题,请将函数包装在类中:doCompare
must bestatic
. IfdoCompare
needs data fromMyClass
you could turnMyClass
into a comparison functor by changing:into
and calling:
Also, isn't
doSort
missing a return value?I think it should be possible to use
std::mem_fun
and some sort of binding to turn the member function into a free function, but the exact syntax evades me at the moment.EDIT: Doh,
std::sort
takes the function by value which may be a problem. To get around this wrap the function inside the class:正如 Andreas Brinck 所说,doCompare 必须是静态的 (+1)。如果您必须在比较器函数中拥有一个状态(使用类的其他成员),那么您最好使用仿函数而不是函数(这样会更快):
使用仿函数总是更好,只是需要更长的时间类型(这可能不方便,但是哦......)
我认为您也可以将 std::bind 与成员函数一起使用,但我不确定如何使用,而且无论如何这都不容易阅读。
2014 年更新:今天我们可以使用 c++11 编译器,因此您可以使用 lambda,代码会更短,但具有完全相同的语义。
As Andreas Brinck says, doCompare must be static (+1). If you HAVE TO have a state in your comparator function (using the other members of the class) then you'd better use a functor instead of a function (and that will be faster):
Using a functor is always better, just longer to type (that can be unconvenient but oh well...)
I think you can also use std::bind with the member function but I'm not sure how and that wouldn't be easy to read anyway.
UPDATE 2014: Today we have access to c++11 compilers so you could use a lambda instead, the code would be shorter but have the exact same semantic.
Rob 提出的解决方案现在是有效的 C++11(不需要 Boost):
事实上,正如 Klaim 提到的,lambda 是一个选项,有点冗长(你必须“重复”参数是整数):
C ++14 在这里支持
auto
:但是,您仍然声明参数是通过副本传递的。
那么问题就是“哪个是最有效率的”。 Travis Gockel 处理了这个问题:Lambda vs Bind绑定。他的基准程序在我的计算机(OS X i7)上给出,
其中 lambda 是直接使用的 lambda,而 lambdabound 是存储在 std::function 中的 lambda 。
所以看来 lambda 是一个更好的选择,这并不奇怪,因为编译器提供了可以从中获利的更高级别的信息。
The solution proposed by Rob is now valid C++11 (no need for Boost):
Indeed, as mentioned by Klaim, lambdas are an option, a bit more verbose (you have to "repeat" that the arguments are ints):
C++14 supports
auto
here:but still, you declared that arguments are passed by copy.
Then the question is "which one is the most efficient". That question was treated by Travis Gockel: Lambda vs Bind. His benchmark program gives on my computer (OS X i7)
where
lambda
is a lambda used directly, andlambda bound
is a lambda stored in astd::function
.So it appears that lambdas are a better option, which is not too much of a surprise since the compiler is provided with higher level information from which it can make profit.
您可以使用
boost::bind
< /a>:You can use
boost::bind
:有一种方法可以做你想做的事,但你需要使用一个小适配器。由于STL不给你写,可以自己写:
然后,你可以使用它:
There is a way to do what you want, but you need to use a small adaptor. As the STL doesn't write it for you, can can write it yourself:
Then, you can use it:
调用
std::sort()
时的第三个参数与std::sort()
所需的函数指针不兼容。请参阅我对另一个问题的回答 详细解释了为什么成员函数签名与常规函数签名不同。The third argument in the calling of
std::sort()
is not compatible to the function pointer needed bystd::sort()
. See my answer to another question for a detailed explanation for why a member function signature is different from a regular function signature.只需将您的辅助函数设置为静态,您将在排序函数中传递该函数。
例如,
现在您可以将其传递到排序函数中
just make your helper function, static which you are going to pass inside the sort function.
for e.g
Now you can pass this inside your sort function
有效使用成员函数的一个非常简单的方法是使用运算符<。也就是说,如果你有一个名为compare的函数,你可以从operator<调用它。这是一个工作示例:
那么您甚至不需要将函数名称提供给 std::sort:
A very simple way to effectively use a member function is to use operator<. That is, if you have a function called compare, you can call it from operator<. Here is a working example:
Then you don't even need to give the function name to std::sort:
更新 Graham Asher 答案,因为您不需要比较,但可以直接使用 less 运算符。
Updating Graham Asher answer, as you don't need the compare but can use the less operator directly.
有人可以举一个例子,其中比较函数用于设置。例如
can some one give an example where comparison function is to be used for set. for example