1

Почему компилятор обрабатывает &Foo::foo как void (*)(). Я ожидаю, что он будет рассматриваться как void(Foo::*)(), так как он является членом Foo.Передайте указатель на статический метод

class Foo 
{ 
    public: 
     static void foo (void){} 
}; 

void foo (void(Foo::*)(void)){} 

int main() 
{ 
    foo(&Foo::foo); // error: cannot convert ‘void (*)()’ to ‘void (Foo::*)()’ 
    return 0; 
} 
+1

Нет другого варианта, который должен иметь простой член функции, потому что указатель 'this' неявно передается этой функции (для этого используется' Foo :: * '). –

+0

@ g-makulik Прошу прощения, я не могу понять. Не могли бы вы рассказать? – Kolyunya

+0

Ответ на крис указывает на это очень ясно: 'void (Foo :: *)()' is for (нестатические члены). Также обратите внимание, что '-> *' для разыменования указателя функции-члена формирует собственный оператор, который нельзя переопределить. –

ответ

2

Вы объявили функцию Foo как статического.

Поэтому он не является членом функции экземпляра Foo.

Этот код работает:

class Foo 
{ 
public: 
    static void foo (void){} 
    void foo2() {} 
}; 

void foo (void(*)(void)){} 
void fooMember (void(Foo::*)(void)){} 

int main() 
{ 
    foo(&Foo::foo); 
    fooMember(&Foo::foo2); 
    return 0; 
} 

EDIT: я обновил описание и добавил кусок кода.

+1

Это довольно обманчиво - это все еще (статический) член. Точнее, указатель на элемент используется только для нестатических членов, которые доступны только через объект. –

+1

Подумайте об изменении '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', потому что он является членом класса Foo. – texasbruce

+0

Я нахожу синтаксис C++ для делегатов довольно запутанным. Что такое доступное имя передаваемой функции? 'void (*) (void)' является только правильным типом ...? –

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