と の 2 つの構造がある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);
}
2 つの関数呼び出しの唯一の明らかな違いcase1()
は、テンプレート引数パラメーターがあり、case2()
ないことです。どちらも Generic_B の親 (つまり&Generic_B::p1
) のメソッドに関数ポインタを渡すことを許可するべきではありませんか?
また、関数ポインターをキャストcase1
すると、エラーが解決する場合があります。
case1<Generic_B>( (void (Generic_B::*)()) &Generic_B::p1);
何が起こっている?