С помощью некоторых людей здесь я скомпилировал следующий код (добавив 'remove_reference'):
template< typename Fn >
bool templateFunctionOne( Fn&& fn )
{
int v = 5;
return fn( v );
}
template < typename Fn >
bool templateFunctionTwo( Fn&& fn )
{
std::future< bool > tk( std::async( std::launch::async,
&templateFunctionOne< typename std::remove_reference<Fn >::type >,
std::forward<Fn>(fn ) ) );
return tk.get();
}
bool printThis( int value )
{
cout << value << endl;
return true;
}
int main()
{
auto func = std::bind( &printThis, std::placeholders::_1 );
return templateFunctionTwo( func );
}
Это хорошо компилируется. Теперь, если я оберну две функции шаблона в структуру и вызову ее из объекта класса наследования, он просто не будет работать:
struct TestParent
{
template< typename Fn > bool templateFunctionOne( Fn&& fn )
{
int val = 5;
return fn( val );
}
template< typename Fn > bool templateFunctionTwo( Fn&& fn )
{
std::future< bool >
tk ( std::launch::async,
&TestParent::templateFunctionOne< typename std::remove_reference<Fn>::type >,
this,
std::forward<Fn>( fn ) ) )
return tk.get();
}
};
struct TestChild: public TestParent
{
bool printThis( int );
bool test();
};
bool TestChild::printThis( int value )
{
return true;
}
bool Testchild::test()
{
auto func = std::bind( &TestChild::printThis, std::placeholders::_1, this);
return templateFunctionTwo( func );
}
int main()
{
TestChild myTest;
myTest.test();
return 0;
}
Ошибки:
no matching for call to '(std::_Bind< bool ( TestChild::\*(std::_Placeholder<1>, TestChild*))(int) >) (int&)'
return fn( val )
~~~~~~^~~~~~~
functional:547:2: note: candidate: template< class ... _Args, class
_Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) [with _Arg = {_Args ...}; _Result =
_Result; _Functor = bool (TestChild::\*)(int); _Bound_args = {std::_Placeholder<1>, TestChild*}] operator()( _Args&&... __args)
^~~~~~~~
Кто-нибудь может мне помочь с этим?