2

以下是代码的要点,在 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(){}”没有参与模板递归。

寻找线索。

4

2 回答 2

4

该代码存在一些语法问题(我怀疑您是否Bjarne 的书中那样复制粘贴),但在修复它们之后,主要问题似乎是recurse()仅在函数 template 之后出现不接受参数的重载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); }

这是一个活生生的例子

于 2013-05-25T14:45:32.640 回答
2

有很多错别字。

  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);
}
于 2013-05-25T14:47:25.173 回答