【问题标题】:how do I fix this c++ typelist template compile error?如何修复这个 c++ typelist 模板编译错误?
【发布时间】:2010-01-27 22:04:08
【问题描述】:

(来自阅读现代 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() {
}

g++ 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’

为什么会出现此错误?我该如何解决这个问题?

【问题讨论】:

    标签: c++ templates typelist


    【解决方案1】:

    您似乎缺少前向声明。

    这是部分特化:

    template <class Head, class Tail>
    struct TypeAt<Typelist<Head, Tail>, 0>
    

    但是编译器不知道它的专业是什么。在它之前添加:

    template <class List, unsigned Index>
    struct TypeAt;
    

    这让编译器知道:“有一个类TypeAt,它有两个模板参数。”所以现在当你专门化它时,编译器就知道你在说什么类了。


    注意,您对Typelist 的使用不正确。这些算法是哨兵终止的。这意味着,就像 C 字符串一样,他们希望数据以特殊值结束。在我们的例子中,这是NullType

    所以,听听Éric 的建议吧。 (即提示:如果您发现他的回答有帮助,请投票。)

    【讨论】:

      【解决方案2】:

      Typelist 被设计为递归使用:它期望它的第二个模板参数是另一个 Typelist 或 NullType(表示递归结束)。

      要定义 foo,你应该写:

      TYPELIST_2(int, double) foo;
      

      或者,如果您想避免使用宏:

      Typelist<int, Typelist<double, NullType> > foo;
      

      【讨论】:

      • 这不是问题,也不是问题。
      • @GMan:重新阅读问题中报告的编译器错误,我同意这不是问题。但是,这是一个问题:TL::Lenght 或 TL::TypeAt 不能用于问题中定义的 Typelist。
      • @Eric:你说得对,这是一个问题,我的错。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多