Suppose you have

  struct A{
  void f(){}
};


struct B:public A{
};


template<typename C,void (C::*f)()>
struct Call{

  void operator()(C* c){
    (c->*f)();
  }
};

why does

int main(){
  void (B::*f)()=&B::f;    
}

work but

 Call<B,&B::f> a;

doesn't, complaining

could not convert template argument ‘&A::f’ to ‘void (B::*)()

?

(Call<A,&A::f> clearly works)

In a similar way

const void (B::*f)()=&B::f;

gives

cannot convert ‘void (A::*)()’ to ‘const void (B::*)()’ in initialization
Edit
Report