Страуструп 4-е издание, стр. 82, пример шаблона переменной не компилируется

Ниже приводится суть кода, который не скомпилируется на 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 () {} «не участвует в рекурсии шаблона.

Ищу подсказку.

2

Решение

Есть несколько синтаксических проблем с этим кодом (я сомневаюсь, что вы вставили копию как есть из книги Бьярне), но после их устранения кажется, что главная проблема заключается в том, что перегрузка 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); }

Вот живой пример.

4

Другие решения

Есть много опечаток.

  1. Следующий код неверен

    template <typename Head, typename Tail...>
    

    Так должно быть

    template <typename Head, typename... Tail>
    
  2. Пакет параметров должен быть расширен ...

    void recurse(Head h, Tail... t)
    
  3. Пропущенный ;, ( а также ...(снова)

    bottom(h); recurse(t...);
    
  4. 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);
}
2

По вопросам рекламы [email protected]