Tu est en train de mélanger pointeur sur fonction et pointeur sur méthode. C'est incompatible, ne serait-ce que parce que ton "void (*f)(int i)" est une fonction qui ne prend qu'un paramètre de type int, alors que "func" dans ta classe "A" est une méthode qui prend deux arguments : this, et un int. (bon de toutes façons en vrai c'est incompatible également pour d'autres raisons)
Il te faut un pointeur sur méthode : typedef void (A::*f) (int)
(puis this->s.f = &A::func, pas this->func ; ça serait pratique de pouvoir capturer le "this" au passage, mais tu n'es qu'en C++

)