Stroustrup第4版,第82页,可变参数模板示例无法编译

时间:2013-05-25 14:38:42

标签: c++ variadic

以下是代码的要点,无法在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 个答案:

答案 0 :(得分:4)

该代码存在一些语法问题(我怀疑你是否按照Bjarne的书中的那样复制粘贴),但在修复它们之后,似乎主要的问题是{的重载{1}}仅在函数模板recurse()之后才会显示不接受参数。

在修复问题之前移动它:

recurse()

这是live example

答案 1 :(得分: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. 应该在模板函数之前声明
  5. void recurse() {},以允许不带参数的调用recurse

  6. 以下代码有效:

    #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);
    }