回调函数:不兼容的参数

时间:2016-03-22 18:45:08

标签: c++ callback

我试图在我的问题中使用回调函数,但是我遇到了一些麻烦。在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);
        ...
    }
}

4 个答案:

答案 0 :(得分:3)

bool compareType(const Person& p1, const Person& p2)

实际上是

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

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

答案 1 :(得分:2)

主要有三种解决方案。

你可以:

  • 将成员方法声明为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的解决方案是不合适的。

答案 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);

您应该将其声明为静态,并且不会传递给它。