这段代码适用于g ++和Clang:
template <typename Sig, Sig& S> struct OpF;
template <typename TR, typename ... Ts, TR (&f)(Ts...)>
struct OpF<TR (Ts...), f> {
};
int foo(int x) {
return 0;
}
OpF<int (int), foo> f;
但新的闪亮的VS2013编译器拯救了
f.cpp(4) : error C3520: 'Ts' : parameter pack must be expanded in this context
哪一个有问题?
答案 0 :(得分:1)
这是VS2013编译器中的一个错误,现在似乎已修复。有关解决方法,请参阅:Visual C++ 12 (VS2013 Preview) variadic template with function parameter workaround。但是,由于VS2013编译器中的另一个错误导致它将模板参数TR (&f)(Ts...)
解析为TR (&f)(void)
,因此您的代码可能仍然无法编译。虽然,也有一个解决方法。您可以使用嵌套类,然后可以使用参数包。例如:
template <typename Sig> struct OpF;
template <typename TR, typename ... Ts>
struct OpF<TR (Ts...)> {
template <TR (&f)(Ts...)>
struct Fn {
};
};
int foo(int x) {
return 0;
}
OpF<int (int)>::Fn<foo> f;
模板声明中不允许使用参数包之后的模板参数。但是,Clang和GCC确实允许它在模板专业化中。所以可能是Clang和GCC对C ++ 11规范过于自由了。
答案 1 :(得分:-1)
这不是一个错误(在VC ++中)在可变参数列表后面有一个备用模板参数。这不是有效的C ++ 11。
看起来像是GCC和CLang中的一个错误。