как мне исправить эту ошибку компиляции шаблона списка типов c ++?

StackOverflow https://stackoverflow.com/questions/2150618

  •  23-09-2019
  •  | 
  •  

Вопрос

(из чтения главы 3 "современный дизайн на c ++")

список типов.ГЭС:

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, либо NullType (сигнализирующий об окончании рекурсии).

Чтобы определить foo, вы должны написать:

TYPELIST_2(int, double) foo;

или, если вы хотите избежать макросов:

Typelist<int, Typelist<double, NullType> > foo;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top