comment puis-je résoudre ce problème c ++ modèle typelist erreur de compilation?
Question
(la lecture du chapitre 3 du design moderne c ++)
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’
Pourquoi est-ce que je reçois cette erreur? Comment puis-je résoudre ce problème?
La solution
On dirait que vous manquez une déclaration avant.
Ceci est une spécialisation partielle:
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0>
Mais le compilateur n'a aucune idée de ce qu'il est une spécialisation. Ajouter ceci avant le:
template <class List, unsigned Index>
struct TypeAt;
est le savoir laisser du compilateur: « Il y a une TypeAt
de classe qui a deux paramètres de modèle. » Alors maintenant, quand vous vous spécialisez il, le compilateur sait quelle classe vous parlez.
Note, votre utilisation de Typelist
est incorrect. Ces algorithmes sont de terminé sentinelle . Cela signifie, comme C-chaînes, ils attendent les données à conclure avec une valeur particulière. Dans notre cas, cela est NullType
.
Alors, prenez Éric . (C.-à-indication:. Si vous avez trouvé sa réponse utile, up-vote it)
Autres conseils
Typelist est conçu pour être utilisé de manière récursive. Elle attend son second paramètre de templater pour être soit un autre Typelist, ou type_null (signalant la fin de la récursion)
Pour définir foo, vous devez écrire:
TYPELIST_2(int, double) foo;
ou, si vous voulez éviter les macros:
Typelist<int, Typelist<double, NullType> > foo;