依赖范围内的 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?
我在实际代码中遇到问题,并使用以下示例代码重现了该问题。
#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?