现在已经明白了,这里确实是只有声明,没有定义,迷失的木桶讲的是对的,这似乎是作者的一个通用做法,对于简单的例子,只给出声明.
void fppm(void (X<N>::*p)(typename X<N>::I)){}; //这里加括号能编译通过
fppm(&X<33>::f); // fine: N deduced to be 33
至于这两句,我是这样理解typename X<N>::I实际是演绎 类X中函数f的形参int,例如声明函数指针作为形参,一般这样
double fun(float (*pfun)(double))实际上 X<N>::*p和*pfun是对应的,(typename X<N>::I)和)(double)是对应的.
(&X<33>::f就是一个函数指针,至于说函数指针不能取地址,我没看到那里有这个限制.
演绎过程如下:
由于33是int型,因此&X<33>::f被演绎为 &X<int>::f(int X<int>::int) 因此是可以别正确演绎的,而
fppm(&X<33.5>::f); 是不能被演绎的.
[ 本帖最后由 lsrwan 于 2010-5-30 20:40 编辑 ]
void fppm(void (X<N>::*p)(typename X<N>::I)){}; //这里加括号能编译通过
fppm(&X<33>::f); // fine: N deduced to be 33
至于这两句,我是这样理解typename X<N>::I实际是演绎 类X中函数f的形参int,例如声明函数指针作为形参,一般这样
double fun(float (*pfun)(double))实际上 X<N>::*p和*pfun是对应的,(typename X<N>::I)和)(double)是对应的.
(&X<33>::f就是一个函数指针,至于说函数指针不能取地址,我没看到那里有这个限制.
演绎过程如下:
由于33是int型,因此&X<33>::f被演绎为 &X<int>::f(int X<int>::int) 因此是可以别正确演绎的,而
fppm(&X<33.5>::f); 是不能被演绎的.
[ 本帖最后由 lsrwan 于 2010-5-30 20:40 编辑 ]