首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复此c++ typelist模板编译错误?

如何修复此c++ typelist模板编译错误?
EN

Stack Overflow用户
提问于 2010-01-28 06:04:08
回答 2查看 878关注 0票数 0

(阅读现代c++设计的第三章)

typelist.hpp:

代码语言:javascript
复制
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

代码语言:javascript
复制
#include "typelist.hpp"

Typelist<int, double> foo;

int main() {
}

g++ main.cpp

代码语言:javascript
复制
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’

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-28 06:11:51

看起来你遗漏了一个转发声明。

这是部分专业化:

代码语言:javascript
复制
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0>

但是编译器不知道它是什么的专门化。在它之前添加以下内容:

代码语言:javascript
复制
template <class List, unsigned Index>
struct TypeAt;

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

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

所以,接受Éric的建议吧。(即提示:如果你觉得他的答案很有帮助,那就给他加票。)

票数 3
EN

Stack Overflow用户

发布于 2010-01-28 06:11:02

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

要定义foo,您应该这样写:

代码语言:javascript
复制
TYPELIST_2(int, double) foo;

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

代码语言:javascript
复制
Typelist<int, Typelist<double, NullType> > foo;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2150618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档