2016-03-22 5 views
2

Я пытаюсь использовать функцию обратного вызова в своей проблеме, но у меня возникли некоторые проблемы. В функции sort(), параметр &compareType имеет ошибку:Функция обратного вызова: Несовместимый аргумент

Argument of type "bool (Person::*)(const Person& p1, const Person& p2)" is incompatible with parameter of type "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); 
     ... 
    } 
} 
+2

Добавить 'static' в функцию сравнения. – skypjack

+2

Сделать функцию сравнения функцией 'static' member:' static bool compareType (const Person & p1, const Person & p2) {return ...}; ' –

ответ

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

фактически типа

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

Вы должны сделать свой метод static правильного типа.

1

Нестатический метод отличается от свободной функции или статического метода. Вы можете видеть, что от типа в сообщении об ошибке:

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

, который отличается от типа простой функции

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

(интуитивно, не-статический метод должен каким-то образом получить this указатель, поэтому компилятор должен сделать что-то другое при его вызове).


Обратите внимание, что ваш compareType не должно быть нестатический члена в любом случае - вы должны были бы назвать его как

personA.compareType(personB, personC) 

, который не имеет особого смысла.


Либо сделать это статический метод (так что вы не вызвать его на примере человека)

class Person { 
    public: 
    static bool compareType(const Person&, const Person&); 
    // ... 
}; 

или просто сделать его свободным функцию

bool comparePeople(const Person&, const Person&); 
-1

Non статический класс неявно добавляет ссылку на это, поэтому ваша функция на самом деле выглядит как

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

Вы должны объявить его статичным, и это не будет передано.

+0

Это не является технически корректным и запутанным. – SergeyA

+0

@SergeyA Может быть, вам следует объяснить ваше мнение? – LibertyPaul

+0

@ Нечего объяснять. В стандарте нет ничего, что говорит о том, что эта функция выглядит так. Вместо этого он говорит, что функция выглядит как 'bool (Person :: *) (const Person &, const Person &);' – SergeyA

2

Существует в основном три решения.

Вы можете:

  • объявить метод член как static
  • определить функцию вне класса, который friend вашего класса (если это необходимо) и использовать его

The Third решение, возможно, самое интересное:

  • Вы можете используйте не-захватывающую лямбда-функцию, которая из-за того, что она не является захватывающей, может разлагаться на указатель на функцию.

Так, в качестве примера, следующий лямбда прекрасно подходит в вашем случае:

[](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 автоматически распадается на указатель на функцию, поэтому в этом случае можно использовать его.
Очевидно, что решение, связанное с лямбдой, не подходит, если вам необходимо получить доступ к частным членам, конечно.

Смежные вопросы