Это потому, что (*) означает соглашение о вызовах по умолчанию, которое составляет __cdecl
.
template<class R, class T0, class T1>
class TFunction<R(*)(T0,T1)>
{
typedef R (*func_type)(T0,T1);
};
фактически равно
template<class R, class T0, class T1>
class TFunction<R(__cdecl *)(T0,T1)>
{
typedef R (__cdecl *func_type)(T0,T1);
};
, что, конечно, не будет соответствовать R(__stdcall *)(T0, T1)
на Win32, где __stdcall
не игнорируется. Если вы хотите частично специализироваться для указателей на функции, вам потребуется частичная спецификация для каждого соглашения о вызовах, которое вы хотите принять.