元编程,模板参数数量错误

时间:2017-03-01 17:08:36

标签: c++

我正在尝试C ++元编程。我有一个TypeList类,它包含一个head类型和一个tail类型,它是另一个TypeList或列表末尾的NullType。

我还有一个IntegerList类,它是Integers上的指针列表(嗯,它是一个日志记录系统,但我删除了尽可能多的代码,并且Integer *元素替换了Logger *元素)

我的文件不会编译,因为g ++抱怨我使用了错误数量的模板参数(1,应该是2)",我不明白为什么。

我哪里做错了?我只是从我信任的网站复制了一些代码,它应该可以工作......我主要决定使用元编程,因为它似乎是一个非常有趣的事情,但我开始放松我的想法^^。< / p>

提前谢谢。

PS。我有一个非常古老的g ++编译器,我无法改变(2006),但2013年的另一个g ++给了我同样的错误。

PS2。我认为这种冷不会编译,因为Integer不是一个类,但我得到了一个真实类的错误,所以我相信我的错误发生在检查之前。

IntegerList.hpp:

#include <list>

typedef int Integer;

class NullType
{
};

template<class H, class T>
class TypeList
{
    typedef H Head;
    typedef T Tail;
};

template<class T>
struct IntegerList : public std::list<Integer*>
{
};

template<>
struct IntegerList<NullType> : public std::list<Integer*>
{
};

template <class H, class T>
struct IntegerList<TypeList<typename H, typename T> > :  public std::list<Integer*>
{ //                                              ^ error right there
  typedef TypeList<typename H, typename T> List_t;
  typedef typename H Head_t;
  typedef typename T Tail_t;

  IntegerList()
  {
    push_back( new Head_t );
    IntegerList<Tail_t> tmp;
    merge( tmp );
  }

  ~IntegerList()
  {
    IntegerList<List_t>::iterator it;
    for ( it=begin(); it!=end(); ++it )
      delete *it;
  }
};

main.cpp中:

#include "IntegerList.hpp"

int main(int argc, char **argv)
{  
   // wrong number of template arguments (1, should be 2)
  IntegerList<TypeList<Integer, NullType> > mylist;
}

1 个答案:

答案 0 :(得分:1)

问题似乎是,在使用typenameIntegerList时,您撒了太多TypeList秒。以下编译:

template <class H, class T>
struct IntegerList<TypeList< H,  T> > :  public std::list<Integer*>
{ 
  typedef TypeList< H,  T> List_t;
  typedef H Head_t;
  typedef T Tail_t;
  . . .
}

完整示例http://coliru.stacked-crooked.com/a/5086e3015dc12ea0