依赖范围内的 C++ 可变参数模板语法

C++ variadic template syntax within dependent scope

我在实际代码中遇到问题,并使用以下示例代码重现了该问题。

#include <iostream>
#include <tuple>

using namespace std;

struct Identity
{
    template <typename... T>
    static std::tuple<T...> Apply(T... val)
    {
        return std::tuple(val...);
    }
};

template <typename F, typename... T>
std::tuple<T...> Apply(T... t)
{
    return F::Apply<T...>(t...);
}

int main()
{
    const auto t = Apply<Identity>(1., 2., 3.);
    cout << std::get<0>(t);
    cout << std::get<1>(t);
    cout << std::get<2>(t);
    return 0;
}

编译错误:

main.cpp:26:22: error: expected primary-expression before ‘...’ token
     return F::Apply<T...>(t...);
                      ^~~
main.cpp:26:22: error: expected ‘;’ before ‘...’ token
main.cpp:26:22: error: expected primary-expression before ‘...’ token

如果我从有问题的语句中删除 ,即 return F::Apply(t...);,并让编译器推断类型,它就可以工作。但是,在我的真实世界代码中,我需要指定类型。特定类型并满足编译器要求的正确语法糖是什么?

您缺少一个关键字。您需要:

return F::template Apply<T...>(t...);

而且会没事的。此错误消息不是最清楚的错误消息。 :) 如果您对详细信息感兴趣,可以在此处找到解释: Where and why do I have to put the "template" and "typename" keywords?