Pregunta

(de leer el capítulo 3 de C ++ moderno diseño)

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’

¿Por qué aparece este error? ¿Cómo puedo solucionar esto?

¿Fue útil?

Solución

Parece que se está perdiendo una declaración hacia adelante.

Esta es una especialización parcial:

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

Sin embargo, el compilador no tiene idea de lo que es una especialización de. Añadir esto antes de que:

template <class List, unsigned Index>
struct TypeAt;

Esta Vamos a los conocimientos del compilador: "Hay una TypeAt clase que tiene dos parámetros de plantilla." Así que ahora cuando usted se especializa ella, el compilador sabe qué clase en la que está hablando.


Tenga en cuenta, el uso de Typelist es incorrecta. Estos algoritmos son de centinela terminado . Este medio, al igual que C-secuencias, que esperan que los datos que se celebrarán con un valor especial. En nuestro caso, se trata de NullType.

Por lo tanto, tomar Éric 's consejo. (Es decir pista:. Si has encontrado su respuesta es útil, por-voto que)

Otros consejos

lista de Tipos está diseñado para ser utilizado de forma recursiva: Se espera que su segundo parámetro Templater para ser ya sea otra lista de Tipos, o nulltype (señalando el final de la recursión)

.

Para definir foo, se debe escribir:

TYPELIST_2(int, double) foo;

o, si se quiere macros deben evitarse:

Typelist<int, Typelist<double, NullType> > foo;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top