【发布时间】:2020-02-07 15:29:00
【问题描述】:
我在传递一个函数时遇到了这个模板推导/替换问题。有人可以帮忙吗,非常感谢:
#include <iostream>
#include <vector>
#include <future>
template< class D > class Region
{
public:
virtual bool setRegion( D& );
protected:
int computeValue( int input, D& dataPack );
template < class Fn > bool setRegionValue( const int, D&, Fn&& );
template < class Fn > bool setAllValues( D&, Fn&& );
protected:
std::vector< int > m_regionValues;
std::vector< std::future< bool > > m_futures;
};
template< class D > int Region< D >::computeValue( const int input,
D& dataPack )
{
return input * dataPack.getData();
}
template< class D >
template < class Fn > bool Region< D >::setRegionValue( const int input,
D& dataPack,
Fn&& function )
{
int output = function( input, dataPack, output );
m_regionValues.push_back( output * 2 );
//check..
return true;
}
template< class D >
template< class Fn > bool Region< D >::setAllValues( D& dataPack,
Fn&& fn )
{
for ( int indx = 0; indx < 10; ++indx )
{
int input = indx * 5;
m_futures.push_back( std::async( std::launch::async,
&Region::setRegionValue< std::remove_reference_t< Fn > >,
this, input, std::ref( dataPack ),
std::forward< Fn >( fn ) ) );
}
//check thread status..
return true;
}
template< class D > bool Region< D >::setRegion( D& dataPack )
{
auto func = std::bind( &Region::computeValue, this,
std::placeholders::_1, std::placeholders::_2 );
return setAllValues( dataPack, func );
}
struct Region1Data
{
int m_regionData;
int getData() const;
};
int Region1Data::getData() const
{
return m_regionData;
}
class Region1: public Region< Region1Data >
{
public:
bool setRegion( Region1Data& );
void outputValue();
};
void Region1::outputValue()
{
//..
}
bool Region1::setRegion( Region1Data& dataPack )
{
if ( !Region::setRegion( dataPack ) )
{
return false;
}
outputValue();
return true;
}
int main()
{
Region1 thisRegion;
Region1Data dataPack;
dataPack.m_regionData = 10;
thisRegion.setRegion( dataPack );
return 0;
}
以下是编译代码时的错误:
example.cpp: 在 'bool Region::setAllValues(D&, Fn&&) [with Fn = std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder, std::_Placeholder)>&; D = Region1Data]': example.cpp:72:39: 'bool Region::setRegion(D&) [with D = Region1Data]' 需要 example.cpp:106:17: 从这里需要 example.cpp:59:63: error: no matching function for call to 'async(std::launch, , Region, int&, std::reference_wrapper, std::_Bind::*)(int, Region1Data& )>(区域, std::_Placeholder, std::_Placeholder)>&)' std::forward( fn ) ) ); ^ example.cpp:59:63: 注意:候选人是: 在 example.cpp:3:0 包含的文件中: /opt/devl/optimize/gcc-4.9.3/include/c++/4.9.3/future:75:5: 注意:模板 std::future::type> std::async(std::launch, _Fn&&, _Args&& ...) 异步(启动 __policy,_Fn&& __fn,_Args&&... __args) ^ /opt/devl/optimize/gcc-4.9.3/include/c++/4.9.3/future:75:5:注意:模板参数推导/替换失败: /opt/devl/optimize/gcc-4.9.3/include/c++/4.9.3/future:代替'模板 std::future::type> std::async(std::launch, _Fn&&, _Args&& 。 ..) [with _Fn = bool (Region::)(int, Region1Data&, std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder, std::_Placeholder)>&&); _Args = {Region, int&, std::reference_wrapper, std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder, std::_Placeholder)>&}]': example.cpp:59:63: 'bool Region::setAllValues(D&, Fn&&) [with Fn = std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder , std::_Placeholder)>&; D = Region1Data]' example.cpp:72:39: 'bool Region::setRegion(D&) [with D = Region1Data]' 需要 example.cpp:106:17: 从这里需要 /opt/devl/optimize/gcc-4.9.3/include/c++/4.9.3/future:75:5: 错误:'class std::result_of::(Region, int&, std::reference_wrapper, std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder, std::_Placeholder)>&) )(int, Region1Data&, std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder, std::_Placeholder)>&&)>' example.cpp: 在 'bool Region::setAllValues(D&, Fn&&) [with Fn = std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder, std::_Placeholder)>&; D = Region1Data]': example.cpp:72:39: 'bool Region::setRegion(D&) [with D = Region1Data]' 需要 example.cpp:106:17: 从这里需要 /opt/devl/optimize/gcc-4.9.3/include/c++/4.9.3/future:95:5: 注意:模板 std::future::type> std::async(_Fn&&, _Args&& ...) 异步(_Fn&& __fn,_Args&&... __args) ^ /opt/devl/optimize/gcc-4.9.3/include/c++/4.9.3/future:95:5:注意:模板参数推导/替换失败: /opt/devl/optimize/gcc-4.9.3/include/c++/4.9.3/future:代替'template std::future::type> std::async(_Fn&&, _Args&& ...) [with _Fn = std::launch; _Args = {bool (Region::)(int, Region1Data&, std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder, std::_Placeholder )>&&), 区域, int&, std::reference_wrapper, std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder, std ::_Placeholder)>&}]': example.cpp:59:63: 'bool Region::setAllValues(D&, Fn&&) [with Fn = std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder , std::_Placeholder)>&; D = Region1Data]' example.cpp:72:39: 'bool Region::setRegion(D&) [with D = Region1Data]' 需要 example.cpp:106:17: 从这里需要 /opt/devl/optimize/gcc-4.9.3/include/c++/4.9.3/future:95:5:错误:'class std::result_of:: 中没有名为“type”的类型)(int , Region1Data&, std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder, std::_Placeholder)>&&), Region, int& , std::reference_wrapper, std::_Bind::*)(int, Region1Data&)>(Region, std::_Placeholder, std::_Placeholder)>&)>'
【问题讨论】: