如何解决这个C ++模板类型串编译错误?
题
(来自读取现代C ++的设计第3章)
typelist.hpp:
class NullType {};
struct EmptyType {};
template <class T, class U>
struct Typelist
{
typedef T Head;
typedef U Tail;
};
#define TYPELIST_1(T1) Typelist<T1, NullType>
#define TYPELIST_2(T1, T2) Typelist<T1, TYPELIST_1(T2) >
#define TYPELIST_3(T1, T2, T3) Typelist<T1, TYPELIST_2(T2, T3) >
#define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, TYPELIST_3(T2, T3, T4) >
#define TYPELIST_5(T1, T2, T3, T4, T5) Typelist<T1, TYPELIST_4(T2, T3, T4, T5) >
#define TYPELIST_6(T1, T2, T3, T4, T5, T6) Typelist<T1, TYPELIST_5(T2, T3, T4, T5, T6) >
namespace TL
{
template <class TList> struct Length;
template <> struct Length<NullType>
{
enum { value = 0 };
};
template <class T, class U>
struct Length< Typelist<T, U> >
{
enum { value = 1 + Length<U>::value };
};
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0>
{
typedef Head Result;
};
template <class Head, class Tail, unsigned int i>
struct TypeAt<Typelist<Head, Tail>, i>
{
typedef typename TypeAt<Tail, i-1>::Result Result;
};
}
的main.cpp
#include "typelist.hpp"
Typelist<int, double> foo;
int main() {
}
克++ main.cpp中
typelist.hpp:37: error: ‘TypeAt’ is not a template
typelist.hpp:43: error: type/value mismatch at argument 2 in template parameter list for ‘template<class Head, class Tail> struct TL::TypeAt’
typelist.hpp:43: error: expected a type, got ‘i’
为什么我得到这个错误?我该如何解决这个问题?
解决方案
看起来像你缺少一个向前声明。
这是一个部分特:
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0>
但是编译器不知道它是一个特例。之前将其添加这样的:
template <class List, unsigned Index>
struct TypeAt;
这让编译器知道:“有是有两个模板参数类TypeAt
”因此,当你专注现在,编译器知道你在说什么类。
请注意,您Typelist
的使用是不正确。这些算法的是定点封端的。这意味着,像C字符串,他们期望的数据具有特殊价值的结论。在我们的情况下,这是NullType
。
因此,采取埃里克的建议。 (即提示:如果您发现自己的答案有帮助,赞成票吧)
其他提示
typelist是设计成可以递归使用:它预计其第二templater参数是任一另一类型串,或零类型(信令递归的终点)
。要foo定义,应该写:
TYPELIST_2(int, double) foo;
或者,如果你想避免的宏:
Typelist<int, Typelist<double, NullType> > foo;
不隶属于 StackOverflow