Я использую gcc 4.4 на сжатии Debian. Рассмотрим следующий код.
#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
соответствует string
, C
соответствует map
, а пакет параметров шаблона Args
соответствует int
. Возможно, у меня неправильный синтаксис, поправьте, пожалуйста. В частности, если нужно, чтобы первый аргумент шаблона в class C
соответствовал T
, а остальные соответствовали пакету параметров шаблона Args
, является ли template <typename T, typename... Args> class C
правильным синтаксисом?
Это дает ошибку
In function 'int main()':
post.cc:18: error: no matching function for call to 'foo()'
Это похоже на вопрос Шаблоны шаблонов Variadic и идеальная пересылка. Этот вопрос предполагает, что это ошибка gcc, но, возможно, я ошибаюсь, думая, что эти вопросы об одном и том же.
Пожалуйста, будьте нежны. Мое знание шаблонов с переменным числом аргументов составляет менее 12 часов; Я просто пытался переписать старый код C++, чтобы уменьшить дублирование. Также прошло некоторое время с тех пор, как я делал какие-либо C++. Если есть обходной путь, пожалуйста, дайте мне знать. Спасибо.
РЕДАКТИРОВАТЬ: Обходной путь, предложенный в комментариях шаблонов Variadic и идеальной пересылки У меня сработало Ise Wisteria, что говорит о том, что это та же ошибка. Конечно, сейчас я (а) задаюсь вопросом, насколько хрупок этот обходной путь и (б) почему он работает и что побудило Исэ задуматься об этом. Хотя, думаю, только Исэ может ответить на последний вопрос. :-)