给定此代码,我遇到了编译器错误,无法解决:

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 *,我想您会得到期望的结果。

10-06 00:05
查看更多