用另一个函数模板重载函数模板是否合法?

时间:2014-02-10 12:48:30

标签: c++ c++11 overloading function-templates

我正在尝试创建一个重载方法,两者都是模板化的。一个需要4个参数,一个需要5个。但是我得到了一个错误

Error C2780 ... OutOfPlaceReturn ... : expects 4 arguments - 5 provided.

... A bunch of template parameters ...

See declaration of ' ... ::OutOfPlaceReturn'

引用4参数方法定义的行

在这种情况下,我试图用5个参数调用重载,所以我不明白为什么编译器认为我想调用只需要4个参数的函数。

完整的上下文太复杂了,无法提供完整的代码示例,但足以说明这一切都发生在一个类模板中,该模板有很多本地typedef,包括samp_typeconst_sampsamp_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数据类型的表现相当不错。不确定我的编译器是否正在低于标准

1 个答案:

答案 0 :(得分:1)

仅对可以实例化的模板执行重载分辨率。这是SFINAE工作原因的一部分。

在您的情况下,您的5 arg重载具有不明确的strideOut。这是模板参数吗?