Он не может скомпилировать B :: bar (), потому что класс B не определен. Но я думаю, что вы оставляете слишком много вопроса. На данный момент:
void do_bar( B* b )
{
Call<B,&B::bar> c(b);
c();
}
почему ты не можешь просто сказать?
void do_Bar(B* b) {
b->bar();
}
Возможно, если вы включите это объяснение, вам будет проще ответить на ваш вопрос.
Во-вторых, зачем это нужно, когда (как видно выше) вы хотите вызвать его через do_bar ()? Почему бы не сделать do_bar внешним?
extern void B::bar( void );