模板化Sum(Args ...)可变参数函数无法编译

时间:2017-08-04 09:56:08

标签: c++ templates variadic-templates

我使用静态struct member技巧来强制执行第二次传递编译并仍然出错:

struct S
{
    template <typename T>
    static T Sum(T t) {
        return t;
    }

    template <typename T, typename ... Rest>
    static auto Sum(T t, Rest... rest) -> decltype(t + Sum(rest...) )
    {
        return t + Sum(rest...);
    }
};

int main()
{
    auto x = S::Sum(1,2,3,4,5);
}

main.cpp:17:14:没有匹配函数来调用'Sum'

1 个答案:

答案 0 :(得分:4)

即使使用clang 4.0,编译也会失败。

我设法使用decltype(auto)(仅auto也可以)编译它而不是显式尾部返回类型。

struct S
{
    template <typename T>
    static T Sum(T t) {
        return t;
    }

    template <typename T, typename ... Rest>
    static decltype(auto) Sum(T t, Rest... rest) 
    {
        return t + Sum(rest...);
    }
};

我认为编译器无法推断类型,因为推导仅取决于递归返回语句。

More info here