我试图在我的问题中使用回调函数,但是我遇到了一些麻烦。在sort()
函数中,参数&compareType
有错误:
类型“bool(Person :: *)(const Person& p1,const Person& p2)”的参数与“compare”类型的参数不兼容`
person.h
class Person
{
public:
bool compareType(const Person& p1, const Person& p2) { return ... };
void sort()
{
...
list->addInOrder(person, &compareType);
...
}
...
}
dlinkedlist.h
typedef bool (*compare)(const Person& p1, const Person&p2);
class dlinkedlist
{
public:
void addInOrder(const Person& person, compare comparefunc)
{
Person person2;
...
comparefunc(person, person2);
...
}
}
答案 0 :(得分:3)
bool compareType(const Person& p1, const Person& p2)
实际上是
类型bool (Person::*) (const Person&, const Person&)
您必须使方法static
具有正确的类型。
答案 1 :(得分:2)
主要有三种解决方案。
你可以:
static
friend
的函数(如果需要)并使用它第三种解决方案可能是最有趣的解决方案:
因此,作为一个例子,在您的情况下,以下lambda非常好:
[](const Person& p1, const Person& p2) { return true; }
它遵循一个最小的工作示例:
struct A { };
using Fn = bool(*)(const A &, const A &);
void f(Fn fn) {
fn(A{}, A{});
};
int main() {
f([](const A &, const A &){ return true; });
};
正如你所看到的,lambda会自动衰减到指向函数的指针,因此在这种情况下使用它是很好的。
显然,如果你需要访问私有成员,那么涉及lambda的解决方案是不合适的。
答案 2 :(得分:1)
非静态方法与自由函数或静态方法不同。您可以从错误消息中的类型中看到:
bool (Person::*)(const Person& p1, const Person& p2)
与简单函数的类型不同
bool (*)(const Person& p1, const Person& p2)
(直观地说,非静态方法必须以某种方式获得this
指针,因此编译器在调用它时必须做一些不同的事情。)
请注意,您的compareType
不应该是非静态成员 - 您必须将其称为
personA.compareType(personB, personC)
没有多大意义。
要么使它成为静态方法(所以你不要在Person的实例上调用它)
class Person {
public:
static bool compareType(const Person&, const Person&);
// ...
};
或者只是让它成为一个免费的功能
bool comparePeople(const Person&, const Person&);
答案 3 :(得分:-1)
非静态类方法隐式添加对此的引用,因此您的函数实际上看起来像
bool compareType(Person *this, const Person &p1, const Person &p2);
您应该将其声明为静态,并且不会传递给它。