4

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

哪一个有错?

4

2 回答 2

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 规范过于自由。

于 2015-02-23T18:45:06.800 回答
-1

这不是错误(在 VC++ 中),可变参数列表后有一个备用模板参数。这不是有效的 C++ 11。

看起来像 GCC 和 CLang 中的错误。

于 2013-06-28T18:09:49.093 回答