IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

C++ 0x variadic template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut C++ 0x variadic template
    Bonjour j'essaye de créer une typelist avec g++ 4.5 mais j'arrive pas à compiler l'exemple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<> struct Typelist {};
     
    template<typename Head, typename Tail...>
    struct Typelist {
         typedef Head head_type;
         typedef Typelist<Tail> tail_type;
    };
    Cela ne compile pas Si quelqu'un peut me mettre sur la piste, parce que les variadic reste bien sombre pour moi. Merci d'avance

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    C'est quoi l'erreur ? tu compiles bien avec -std=c++0x ?



    edit : faut croire que mes yeux ne sont pas un aussi bon compilateur que ce que j'aime à croire ... cf remarque d'en dessous

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Ta syntaxe n'est pas bonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<class Head, class... Tail>
    struct Typelist {
         typedef Head head_type;
         typedef Typelist<Tail...> tail_type;
    };
    Je te conseille cette article pour une présentation des variadic :
    http://blog.emmanueldeloget.com/inde...es-variadiques
    Et si tu savais déjà utilisé les template ca devrait être suffisant

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    Merci pour les réponse; je vais aller regarder le lien. Par contre avec ta correction cela ne compile toujours pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <iostream>
     
    using namespace std;
     
    template<> struct Typelist {};
     
    template<class Head, class... Tail>
    struct Typelist {
         typedef Head head_type;
         typedef Typelist<Tail...> tail_type;
    };
     
    typedef Typelist<int, char> l;
     
     
     
    int main() 
    {
        return 0;
    }
    J'ai les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    victor@victor-laptop:~/Bureau/a$ make
    g++-4.5 -o main.o -c main.cpp -std=c++0x
    main.cpp:5:28: error: explicit specialization of non-template ‘Typelist’
    main.cpp:8:8: error: ‘Typelist’ is not a template type
    main.cpp:13:9: error: ‘Typelist’ is not a template
    make: *** [main.o] Erreur 1
    Je compile bien en c++0x, avec un compilateur récent qui suivant le site de gcc supporte bien les variadics.

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Le problème vient de template<> struct Typelist {}; tu veus définir un template mais tu donnes pas de paramètre, comment veux tu que ca marche !

  6. #6
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Regarde bien l'exemple de l'article donné par Flob90
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // pré-déclaration de C
    template <class... Args> struct C;
     
    // plus de paramètre : fin de la récursion
    template <> 
    struct C<> { };
    // récursion : C<T,Args...> hérite de C<Args...> 
    template <class T, class... Args>
    struct C<T, Args...> : public C<Args...> {
      T value;
    };
    D'abord il faut définir la signature générale de ton template (ici un template prenant 0 ou N types)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template<class... Types>
    struct Typelist; // une pré-déclaration suffit ici,
    // les spécialisations couvriront tous les cas possibles
    ensuite ses spécialisations :
    - avec Types = vide (cas de base)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<>
    struct Typelist<>{};
    - avec Types = Head, class... Tail (récursion)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<class Head, class... Tail>
    struct Typelist<Head,Tail...> {
         typedef Head head_type;
         typedef Typelist<Tail...> tail_type;
    };

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    Merci pour vos réponses c'est exactement se qu'il me fallait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C++0x] Variadic template
    Par victor_gasgas dans le forum Langage
    Réponses: 7
    Dernier message: 04/02/2011, 17h20
  2. Hierarchie et variadic template
    Par victor_gasgas dans le forum Langage
    Réponses: 5
    Dernier message: 22/09/2010, 17h24
  3. [C++0x] Variadic template : un constructeur par type
    Par Florian Goo dans le forum Langage
    Réponses: 2
    Dernier message: 08/04/2009, 18h33
  4. Réponses: 2
    Dernier message: 10/01/2009, 13h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo