Debian スクイーズで gcc 4.4 を使用しています。次のコードを検討してください。
#include <map>
#include <string>
using std::map;
using std::string;
// Args lets the user specify additional explicit template arguments
template <typename T,
template <typename T, typename... Args> class C,
typename... Args>
C<T, Args...> foo()
{
C<T, Args...> x;
return x;
}
int main(void)
{
map<string, int> a = foo<string, map, int>();
}
したがって、ここでの考え方は、T
matches string
、C
matches map
、およびテンプレート パラメーター パックのArgs
matchesint
です。構文の一部が間違っている可能性があります。その場合は修正してください。特に、最初のテンプレート引数class C
を一致T
させ、残りをテンプレート パラメータ pack と一致させたい場合、構文は正しいですかArgs
?template <typename T, typename... Args> class C
これにより、エラーが発生します
In function 'int main()':
post.cc:18: error: no matching function for call to 'foo()'
これは、質問Variadic template templates and perfect forwardingに似ているようです。その質問は、これが gcc のバグであることを示唆していますが、これらの質問が同じことであると誤解している可能性があります。
優しくしてください。可変個引数テンプレートに関する私の知識は、12 時間も経っていません。重複を減らすために、いくつかの古い C++ コードを書き直そうとしていました。私がC++をやったのも久しぶりです。回避策がある場合は、お知らせください。ありがとう。
編集: Variadic テンプレート テンプレートのコメントで提案された回避策と、Ise Wisteriaによる完全な転送がうまくいきました。これは、これが同じバグであることを示唆しています。もちろん、私は今、(a) この回避策がどれほど壊れやすいか、(b) なぜ機能するのか、伊勢がそれを考えた動機は何なのか、疑問に思っています。伊勢しか答えられないんだろうけど。:-)