我正在尝试创建一个重载方法,其中两者都是模板化的。一个需要4个论据,一个需要5个论据。然而,我在的线路上遇到了一个错误
Error C2780 ... OutOfPlaceReturn ... : expects 4 arguments - 5 provided.
... A bunch of template parameters ...
See declaration of ' ... ::OutOfPlaceReturn'
它引用了4参数方法定义的行
在这种情况下,我试图用5个参数调用重载,所以我不明白为什么编译器认为我要调用只需要4个参数的函数。
完整的上下文太复杂,无法给出完整的代码示例,但只要说这一切都发生在类模板内部就足够了,该类模板有很多本地typedef
,包括samp_type
、const_samp
、samp_vec
等。这些都是包含POD类型的模板参数的typedef,或者是这些POD类型之一的std::array
typedef int_fast16_t fast_int;
typedef typename std::add_const< fast_int >::type const_fast_int;
typedef samp_type (*func_type)(const_samp, const_samp);
template<func_type operation, const_fast_int strideA, const_fast_int strideB, const_fast_int strideOut>
static inline samp_vec OutOfPlaceReturn(const std::array<samp_type, strideA * vectorLen> &a,
const_fast_int strideA,
const std::array<samp_type, strideB * vectorLen> &b,
const_fast_int strideB,
const_fast_int strideOut)
{
std::array<samp_type, vectorLen * strideOut> output;
for(fast_int i = 0; i < vectorLen; ++i)
output[i * strideOut] = operation(a[i * strideA], b[i * strideB]);
return output;
}
template<func_type operation, const_fast_int strideA, const_fast_int strideOut>
static inline samp_vec OutOfPlaceReturn(const std::array<samp_type, strideA * vectorLen> &a,
const_fast_int strideA,
const_samp_ref b,
const_fast_int strideOut)
{
std::array<samp_type, vectorLen * strideOut> output;
for(fast_int i = 0; i < vectorLen; ++i)
output[i * strideOut] = operation(a[i * strideA], b);
return output;
}
如果我理解正确的话,在调用模板函数时,你不需要提供编译器可以通过函数参数推断出的模板参数,所以调用看起来像这个
static samp_vec subtract(const_vec_ref a, const_fast_int strideA, const_vec_ref b, const_fast_int strideB, const_fast_int strideOut)
{ return OutOfPlaceReturn<MathClass::subtract>(a, strideA, b, strideB, strideOut); }
那么,我调用这些模板方法的方式有什么问题吗?我期望编译器解决重载的方式有问题吗?
编辑
我正在使用VS2010。到目前为止,它在模板和C++11数据类型方面做得很好。不确定我的编译器是否低于
重载解析只针对可以实例化的模板。这也是SFINAE
工作的部分原因。
在您的情况下,您的5 arg重载有一个不明确的strideOut
。这是不是一个模板参数?