我正在尝试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;
}
答案 0 :(得分:1)
问题似乎是,在使用typename
和IntegerList
时,您撒了太多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;
. . .
}