VS2013失败,具有可变参数模板专业化

时间:2013-06-27 00:39:42

标签: c++ visual-c++ c++11 variadic-templates

这段代码适用于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

哪一个有问题?

2 个答案:

答案 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中的一个错误。