回调函数:参数不兼容

Callback function: Incompatible argument

本文关键字:不兼容 参数 函数 回调      更新时间:2023-10-16

我试图在问题中使用回调函数,但遇到了一些麻烦。在sort()函数中,参数&compareType有一个错误:

类型为"bool(Person::*)(const Person&p1,const Person&p2)"的参数与类型为"compare"`的参数不兼容

人.h

class Person
{
public:
    bool compareType(const Person& p1, const Person& p2) { return ... };
    void sort()
    {
        ...    
        list->addInOrder(person, &compareType);
        ...
    }
    ...
}

dlinkdlist.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);
        ...
    }
}
bool compareType(const Person& p1, const Person& p2)

实际上是类型

bool (Person::*) (const Person&, const Person&)

您必须使您的方法static具有正确的类型。

主要有三种解决方案。

您可以:

  • 将成员方法声明为static
  • 在类的friend之外定义一个函数(如果需要)并使用它

第三种解决方案可能是最有趣的:

  • 您可以使用非捕获lambda函数,因为它是非捕获函数,所以可以衰减为指向函数的指针

因此,作为一个例子,以下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的解决方案是不合适的。

非静态方法不同于自由函数或静态方法。您可以从错误消息中的类型中看到:

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&);

非静态类方法隐式添加了对此的引用,因此您的函数实际上看起来像

bool compareType(Person *this, const Person &p1, const Person &p2);

您应该将其声明为静态,这将不会传递到。

相关文章: