struct A{
void f(){}
};
struct B:public A{
};
template<typename C,void (C::*f)()>
struct Call{
void operator()(C* c){
(c->*f)();
}
};
爲什麼
int main(){
void (B::*f)()=&B::f;
}
工作,但
Call<B,&B::f> a;
不抱怨
could not convert template argument ‘&A::f’ to ‘void (B::*)()
?
(Call<A,&A::f>
明確工作)
以類似的方式
const void (B::*f)()=&B::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
對不起,你是對的,謝謝! –