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 :

[Template] Question de template de templates imbriqués


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut [Template] Question de template de templates imbriqués
    Salut à tous,

    Je me suis embarqué dans un système assez complexe de template, et je me heurte à un mur :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    #include <iostream>
     
    template<template<int, int> class Test1>
    struct Test2
    {
      static void run()
      {
        Test1<1, 1>::print();
      }
    };
     
    template<class Nothing>
    struct Test3
    {
      template<int di, int dk>
      struct Test4
      {
        static void print()
        {
          std::cout << di * dk << std::endl;
        }
      };
    };
     
    int main(int argc, char** argv)
    {
      Test2<Test3<float>::Test4<1, 1> >::run();
    }
    Le résultat est :
    test.cpp: In function `int main(int, char**)':
    test.cpp:28: error: type/value mismatch at argument 1 in template parameter list for `template<template<int <anonymous>, int <anonymous> > class Test1> struct Test2'
    test.cpp:28: error: expected a class template, got `Test3<float>::Test4<1, 1>'
    test.cpp:28: error: invalid type in declaration before ';' token
    La question est que mettre comme paramètre template pour Test2 afinq u'il reconnaisse l'utilisation de la structure imbriquée TesT4.

    Pour le moment, je n'ai pas trouvé plus simple : Test4 est en fait une structure permettant de calculer des différences finies 2D, Test3 est la classe parente définissant le type de calcul, et Test2 est la classe effectuant une mise à jour en différence finie.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    Salut,

    Tout simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main(int argc, char** argv)
    {
      Test2<Test3<float>::Test4>::run();
    }
    ?

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Oups, pardon...
    J'ai cru que j'avais reproduit le problème que j'avais à plus grande échelle, mais en fait non

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Bon, voici le véritable exemple :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <iostream>
     
    template<class Nothing>
    struct Test
    {
      template<template<int, int> class Test1>
      struct Test2
      {
        static void run()
        {
          Test1<1, 1>::print();
        }
      };
    };
     
    template<class Nothing>
    struct Test3
    {
      template<int di, int dk>
      struct Test4
      {
        static void print()
        {
          std::cout << di * dk << std::endl;
        }
      };
    };
     
    template<class Nothing>
    struct Test5
    {
      static void other_run()
      {
        Test<Nothing>::Test2<Test3<float>::Test4>::run()
      }
    };
     
    int main(int argc, char** argv)
    {
      Test5<float>::other_run();
    }
    C'est la même chose qu'avant, sauf que la première structure ayant comme argument template une classe template est encapsulée dans une autre structure template.

    Pour expliquer, la structure Test3 est une structure effectuant les différences finies, la structure Test4 propose une manière de faire. La structure Test encapsule un calcul de différence finie (mais je peux en avoir plusieurs, selon le modèle utilisé, d'où ma volonté de factoriser le plus possible), et Test2 représente une des étapes du calcul. Enfin, Test5 est une structure de contrôle de tout l'architecture.

    L'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    test.cpp: In static member function `static void Test5<Nothing>::other_run()':
    test.cpp:35: error: missing template arguments before '>' token
    test.cpp:35: error: `::run' has not been declared
    test.cpp:36: error: expected `;' before '}' token
    test.cpp: In static member function `static void Test5<Nothing>::other_run() [with Nothing = float]':
    test.cpp:41:   instantiated from here
    test.cpp:35: error: dependent-name ` Test<Nothing>::Test2' is parsed as a non-type, but instantiation yields a type
    test.cpp:35: note: say `typename  Test<Nothing>::Test2' if a type is meant
    avec GCC 3.4, j'ai une erreur identique avec ICC. Je n'arrive pas à savoir ce qui se apsse réellement, ça doit être tout con, ou un truc interdit, mais sur le coup, je ne vois plus

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Test<Nothing>::template Test2<Test3<float>::template Test4>::run();
    Meme logique que pour les typenames.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ah oui, j'avais complètement oublié cette utilisation du "template".

    un grand

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

Discussions similaires

  1. Question sur les classes template
    Par Djobird dans le forum C++
    Réponses: 2
    Dernier message: 17/10/2010, 20h05
  2. question sur modification de template avec PSD et SWF
    Par rayanasky dans le forum Flash/Flex
    Réponses: 5
    Dernier message: 31/03/2009, 12h15
  3. [Template] Question sur la programmation générique
    Par tlemcenvisit dans le forum C++
    Réponses: 4
    Dernier message: 03/11/2008, 11h51
  4. Question sur une classe <template>
    Par Pingva dans le forum C++
    Réponses: 1
    Dernier message: 26/01/2007, 17h16
  5. [XSLT] Call-template question de débutant
    Par ben23 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/07/2006, 00h20

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