假设您有两个结构,Generic_A
并且Generic_B
. Generic_B
源自Generic_A
。为什么当Generic_B
尝试访问其父级中的方法时Generic_A
,会产生以下错误:
test2.cpp: In function 'int main()':
test2.cpp:26: error: no matching function for call to 'case1(void (Generic_A::*)()'
使用 gcc 4.4.6 版编译的这段代码复制了这个问题:
#include <stdio.h>
struct Generic_A
{
void p1() { printf("%s\n", __PRETTY_FUNCTION__); };
};
struct Generic_B : public Generic_A
{
void p2() { printf("%s\n", __PRETTY_FUNCTION__); };
};
template <class T,class... ARGS>
void case1( void (T::*p)(ARGS...) ) {
printf("%s\n", __PRETTY_FUNCTION__);
}
template <class T>
void case2( void (T::*p)() ) {
printf("%s\n", __PRETTY_FUNCTION__);
}
main()
{
//generates error
case1<Generic_B>(&Generic_B::p1);
//compiles fine
case2<Generic_B>(&Generic_B::p1);
}
两个函数调用之间唯一明显的区别是case1()
具有模板实参参数,而case2()
没有。他们不应该都允许您将函数指针传递给 Generic_B 的父级(即&Generic_B::p1
)中的方法吗?
此外,强制转换函数指针case1
似乎有时可以解决错误:
case1<Generic_B>( (void (Generic_B::*)()) &Generic_B::p1);
到底是怎么回事?