Suponga que tieneuna función superclase como parámetro de plantilla no nombretipo
struct A{
void f(){}
};
struct B:public A{
};
template<typename C,void (C::*f)()>
struct Call{
void operator()(C* c){
(c->*f)();
}
};
¿por qué
int main(){
void (B::*f)()=&B::f;
}
trabajo, pero
Call<B,&B::f> a;
no, quejándose
could not convert template argument ‘&A::f’ to ‘void (B::*)()
?
(Call<A,&A::f>
funciona con claridad)
De manera similar
const void (B::*f)()=&B::f;
da
cannot convert ‘void (A::*)()’ to ‘const void (B::*)()’ in initialization
¡Genial, gracias! Por cierto, ¿también sabe que const void (B :: * f)() = &B::f; no se acepta también? –
@Fabio: void (B :: * const f)() = & B :: f funciona bien :). const void (B :: * f)() significa puntero al método que devuelve el valor de vacío const, por lo que las firmas de los métodos no coinciden en este último caso. – user396672
lo siento, tienes razón, ¡gracias! –