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 :

CRTP avec template template


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut CRTP avec template template
    Bonjour,

    J'ai besoin de template template, chose que je ne fais pas tous les jours, et malheureusement, je n'ai pas au boulot mon bouquin de Josuttis/Vandevoorde.

    J'en appelle donc à vous, car pour ce genre de question, il est difficile de trouver des réponses par Google.

    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
    template<class TA, class TB, class TC, template <class, class, class> class TDerived>
    class IInterface
    {
       ... 
    };
     
    template <class TA, class TB, class TC>
    class IWrapper : public IInterface<TA, TB, TC, IWrapper <TA, TB, TC> >
    {
       ... 
    };
     
    template <class TA, class TB, class TC>
    class Implementation: public IWrapper <TA, TB, TC>
    {
       ... 
    };

    Vous reconnaissez un CRTP.

    Visual râle sur la déclaration de la seconde classe, en disant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    syntax error : missing ',' before '<'
    see reference to class template instantiation 'route::IWrapper <TA, TB, TC>' being compiled
    Dans la déclaration de IWrapper, j'ai modifié comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class TA, class TB, class TC>
    class IWrapper : public IInterface<TA, TB, TC, IWrapper>
    {
       ... 
    };
    Mais j'obtiens le même message d'erreur.

    Notez que dans une démarche de debug, j'ai commenté le contenu de toutes les classes, en ayant juste en bout de course un cpp vide qui se contente d'inclure le .h contenant la déclaration d'Implementation. Je ne fais aucune instanciation...

  2. #2
    screetch
    Invité(e)
    Par défaut
    j'ai essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<class TA, class TB, class TC, template <class, class, class> class TDerived>
    class IInterface
    {
    };
     
    template <class TA, class TB, class TC>
    class IWrapper : public IInterface<TA, TB, TC, IWrapper >
    {
    };
     
    template <class TA, class TB, class TC>
    class Implementation: public IWrapper <TA, TB, TC>
    {
    };
    et j'ai aucune erreur.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Merci.

    Du coup, je viens d'essayer ce code inspiré de mon vrai source, et ça fonctionne aussi...

    Je vais remonter à partir de ce code evrs mon code de production, et je vous tiendrai au courant de l'origine du problème !

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Dans mon équipe, on appelle ca la solution du canard.

    Explique à un canard en plastique pourquoi ton problème ne fonctionne pas. Le temps de lui dire pour qu'il comprenne, tu trouveras la cause du problème.

    Bon, nous sommes d'accord, ca marche mieux avec une belle-mère, un neveu, une cousine, un commercial, ou n'importe qui d'autre qui ne coderait pas.

    Je suis tout de même curieux de voir ce qui a pu provoquer ton problème.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Ben tu sais, hier, j'ai bataillé tout simplement parce que j'avais oublié de mettre une namespace autour d'une une déclaration de classe. Et les messages d'erreur de Visual ne m'ont pas du tout aidé (comme quand on oublie un point-virgule après une déclaration de classe) !

    Ça va sans doute être un truc à la noix comme ça...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    C'est encore plus minable que je ne pensais : mes trois classes sont dans des fichiers séparés, et celui de IWrapper n'incluait pas celui de IInterface. Le message d'erreur de Visual était pourtant clair !

    IL faut vous dire qu'à la base, j'ai un niveau de template supplémentaire (template template template), et que j'étais donc parti immédiatement sur la piste d'une syntaxe foireuse dans ces déclarations de templates...

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    C'est pas beau, ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<class TA, class TB, class TC, template <class, class, class, template <class,class> class> class TDerived>
    class IInterface
    {
        ...
    };
    Ça ne devrait même pas avoir le droit de marcher, pour nous interdire de faire des horreurs pareilles.

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Ma gni fique! Un chef d'œuvre!

    Dîtes, quelqu'un sait si le code est recyclable? C'est pour choisir la poubelle…

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

Discussions similaires

  1. Problème avec template template template
    Par oodini dans le forum Langage
    Réponses: 6
    Dernier message: 23/11/2012, 14h40
  2. Probleme avec les templates
    Par TeC_MaN dans le forum C++
    Réponses: 2
    Dernier message: 08/01/2006, 14h53
  3. [XSLT] Problème avec apply-templates
    Par NeoMan dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/12/2005, 14h45
  4. [phpBB] Function avec le Template phpBB
    Par mangafan dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 27/09/2005, 16h32
  5. Réponses: 3
    Dernier message: 22/08/2005, 18h28

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