Ниже приводится суть кода, который не скомпилируется на g ++ 4.7.1
#include <iostream>
using namespace std;
template <typename T> void bottom(T x) {cout << x << " ";}
template <typename Head, typename Tail...>
void recurse(Head h, Tail t) {bottom(h); recurse(t...)}
void recurse(){}
int main() { recurse(1,2.2); }
По неизвестным причинам void recurse () {} «не участвует в рекурсии шаблона.
Ищу подсказку.
Есть несколько синтаксических проблем с этим кодом (я сомневаюсь, что вы вставили копию как есть из книги Бьярне), но после их устранения кажется, что главная проблема заключается в том, что перегрузка recurse()
Принятие без аргументов появляется только после шаблона функции recurse()
,
Перемещение, прежде чем это решит проблему:
#include <iostream>
using namespace std;
template <typename T>
void bottom(T x) {cout << x << " ";}
void recurse(){} // <== MOVE THIS BEFORE THE POINT WHERE IT IS CALLED
template <typename Head, typename... Tail>
void recurse(Head h, Tail... t)
{
bottom(h);
recurse(t...);
}
int main() { recurse(1,2.2,4); }
Вот живой пример.
Есть много опечаток.
Следующий код неверен
template <typename Head, typename Tail...>
Так должно быть
template <typename Head, typename... Tail>
Пакет параметров должен быть расширен ...
void recurse(Head h, Tail... t)
Пропущенный ;
, (
а также ...
(снова)
bottom(h); recurse(t...);
void recurse() {}
должен быть объявлен перед функцией шаблона, чтобы разрешить вызов recurse
без аргументов.
Следующий код работает:
#include <iostream>
using namespace std;
template <typename T>
void bottom(T x)
{
cout << x << " ";
}
void recurse()
{
}
template <typename Head, typename... Tail>
void recurse(Head h, Tail... t)
{
bottom(h);
recurse(t...);
}
int main()
{
recurse(1,2.2);
}