簡體   English   中英

如何解決此c ++類型列表模板編譯錯誤?

[英]how do I fix this c++ typelist template compile error?

(摘自現代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’

為什么會出現此錯誤? 我該如何解決?

好像您缺少前向聲明。

這是部分專業化:

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

但是編譯器不知道它是什么專業化的。 在此之前添加:

template <class List, unsigned Index>
struct TypeAt;

這讓編譯器知道:“有一個TypeAt類,它具有兩個模板參數。” 因此,現在當您對其進行專門化時,編譯器便知道了您在說什么類。


請注意,您對Typelist的使用不正確。 這些算法以哨兵終止 這意味着,像C字符串一樣,他們希望數據以特殊值結束。 在我們的例子中,這是NullType

因此,請聽Éric的建議。 (即提示:如果您認為他的回答有用,請對其進行投票。)

Typelist被設計為可遞歸使用:它期望其第二個templater參數是另一個Typelist或NullType(表示遞歸結束)。

要定義foo,您應該編寫:

TYPELIST_2(int, double) foo;

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM