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 プレビュー) 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 に答える