非型名テンプレートパラメータとしてスーパークラスの機能を渡す
int main(){
void (B::*f)()=&B::f;
}
作業が、
Call<B,&B::f> a;
が
could not convert template argument ‘&A::f’ to ‘void (B::*)()
を訴えないんなぜあなたは
struct A{
void f(){}
};
struct B:public A{
};
template<typename C,void (C::*f)()>
struct Call{
void operator()(C* c){
(c->*f)();
}
};
を持っていると仮定
?
同様
const void (B::*f)()=&B::f;
で
を(Call<A,&A::f>
は明らかに動作します)間違っている正確に何
cannot convert ‘void (A::*)()’ to ‘const void (B::*)()’ in initialization
よかった、ありがとう!ちなみに、const void(B :: * f)()= &B::f;も受け付けていません。 –
@Fabio:void(B :: * const f)()=&B :: fはうまく動作します:)。 const void(B :: * f)()はconst void値を返すメソッドへのポインタを意味するので、メソッドのシグネチャは後者の場合には不一致です。 – user396672
申し訳ありませんが、あなたは正しいです、ありがとう! –