给定此代码,我遇到了编译器错误,无法解决:
struct TestType
{
void PrintX( void )
{
printf( "TestType::PrintX : %d\n", x );
}
int x;
};
// Error here, BuildFunction overload not found
Function f = BuildFunction<decltype( &TestType::PrintX ), &TestType::PrintX>( &TestType::PrintX );
// Here is the overload
template <typename FunctionType, FunctionType *FunctionPtr, typename C>
Function BuildFunction( void (C::*fn)( void ) )
{
return Function( fn, &CallMethodVoid<FunctionType, FunctionPtr, C> );
}
我的确切错误消息是:
1>main.cpp(141): error C2893: Failed to specialize function
template 'Function BuildFunction(void (__thiscall C::* )(void))'
1> With the following template arguments:
1> 'void (__thiscall TestType::* )(void)'
1> 'TestType'
这段代码与静态C函数(以及适当的重载)配合得很好,当尝试处理类或struct方法时,我只是遇到了这个问题。关于可能是什么问题的任何想法?
最佳答案
问题在于BuildFunction<>
的第二个模板参数的类型。
由于您已将FunctionType
作为第一个模板参数传递,因此第一个模板参数void (TestType::*)(void)
推导为decltype(&TestType::PrintX)
。您指定的第二个模板参数读取FunctionType *
。因此,第二个模板参数期望使用void (TestType::**)(void)
(指向成员函数指针的指针),我认为这不是您想要的。如果将第二个模板参数更改为FunctionType
而不是FunctionType *
,我想您会得到期望的结果。