考虑一个c ++模板函数专业化:
namespace test {
template < const int L, typename InputIt >
typename std::iterator_traits<InputIt>::value_type
Sum_L( InputIt beg, InputIt end)
{
typedef typename std::iterator_traits<InputIt>::value_type real_t;
for( int i=0 ; i<L; ++i)
call_rearrange_sum( beg, end);
real_t sum( 0 );
for( ; beg != end; ++beg)
sum += *beg;
return sum;
}
template < const int L, typename Real >
Real
Sum_L( const std::size_t len, Real * x)
{
for( int i=0 ; i<L; ++i)
call_rearrange_sum( x, x+len);
Real sum( 0 );
for( std::size_t i=0; i< len; ++i)
sum += x[i];
return sum;
}
template < typename Real, typename Func >
Real
special_sum( std::size_t len, const Real * const x, const Real * y, Func f)
{
std::vector<Real> res( 2*len );
for( std::size_t i=0; i<len; ++i) {
Real tmp;
res.push_back( call_operator( x[i], y[i], &tmp);
res.push_back( tmp );
}
return f( res.begin(), res.end(), f);
}
}
现在我想将上述功能用作:
double my_test( const std::size_t len, double * x, double * y)
{
return test::special_sum( len, x,y,
test::Sum_L< 4, typename std::vector<double>::iterator> );
}
gcc 4.9.2它无法找到正确的模板特化功能。错误是“没有匹配函数来调用'special_sum(std :: size_t&amp;,const double *&amp;,const double *&amp;,&lt; unresolved overloaded function type&gt;)'。
Ι知道编译器很难解决。从我尝试的任何东西,它是两个模板函数'Sum_L'之一来获得额外的虚拟模板参数。还有其他办法吗?
感谢。
答案 0 :(得分:0)
没有函数模板的部分特化,专门化函数模板的唯一方法是提供完整的特化。你正在做的事实上只是函数重载。
纠正模糊过载的最简单方法是简单地重命名其中一个。如果你想保留名称Sum_L
以用于某些用途,你也可以用一个新函数来包装它以用于传递,如下所示:
template < const int L, typename InputIt >
typename std::iterator_traits<InputIt>::value_type
Sum_Wrapper(InputIt beg, InputIt end)
{
return Sum_L<L, InputIt>(beg, end);
}
然后这应该可以正常工作:
double my_test(const std::size_t len, double * x, double * y)
{
return test::special_sum<double>(len, x, y,
test::Sum_Wrapper< 4, typename std::vector<double>::iterator>);
}