Я использую gcc 4.4 на сжатии 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
матчи 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 template templates and perfect forwarding. Этот вопрос предполагает, что это ошибка gcc, но, может быть, я ошибаюсь, думая, что эти вопросы касаются одного и того же.
Будьте любезны. Мое знание вариационных шаблонов составляет менее 12 часов; Я просто пытался переписать старый код на C++, чтобы уменьшить дублирование. Прошло некоторое время с тех пор, как я сделал C++. Если есть обходной путь, пожалуйста, дайте мне знать. Благодарю.
EDIT: Обходной путь, предложенный в комментариях Variadic template templates and perfect forwarding от Ise Wisteria, работал на меня, что говорит о том, что это та же ошибка. Конечно, я сейчас (а) интересуется, насколько хрупким это обходное решение, и (б) почему он работает, и что побудило Исе думать об этом. Хотя я думаю, что только Ise может ответить на последний бит. :-)
Код компилируется на g ++ 4.7. Должна быть ошибка. – kennytm
@KennyTM: Спасибо. Это означает, что мне не нужно сообщать об этом, верно? –
Право. ~~~~~~~~~~ – kennytm