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 :

Spécialisation de template parametre avec Enum


Sujet :

Langage C++

  1. #1
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut Spécialisation de template parametre avec Enum
    Avec Visual Express
    Pourquoi le code suivant code suivant compile:
    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
    class A
    {
    public:
       enum E_Enumeration{
          E_1,
          E_2,
          E_3
       };
       template<enum E_Enumeration> struct stTemplate{};
     
       template<> struct stTemplate<E_1>{typedef int Type;};
       template<> struct stTemplate<E_2>{typedef float Type;};
       template<> struct stTemplate<E_3>{typedef char Type;};
     
       template<enum E_Enumeration P_E>
       typename stTemplate<P_E>::Type Valeur()
       {
          return stTemplate<P_E>::Type();
       }
    };
    int main()
    {
       A a;
       a.Valeur<A::E_1>();
       a.Valeur<A::E_2>();
       a.Valeur<A::E_3>();
       return 0;
    }
    Mais le code suivant ne compile 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    enum E_Enumeration{
       E_1,
       E_2,
       E_3
    };
    template<enum E_Enumeration> struct stTemplate{};
     
    template<> struct stTemplate<E_1>{typedef int Type;};
    template<> struct stTemplate<E_2>{typedef float Type;};
    template<> struct stTemplate<E_3>{typedef char Type;};
     
    class A
    {
    public:
     
       template<enum E_Enumeration P_E>
       typename stTemplate<P_E>::Type Valeur()
       {
          return stTemplate<P_E>::Type();
       }
    };
    int main()
    {
       A a;
       a.Valeur<E_1>();
       a.Valeur<E_2>();
       a.Valeur<E_3>();
       return 0;
    }
    J'ai toute une palanqué de
    error C2440: 'specialization' : cannot convert from 'E_Enumeration' to 'E_Enumeration'
    pour les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<> struct stTemplate<E_1>{typedef int Type;};
    Nota: le code compile avec gcc (à un chouïa près).

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    J'ai comme un doute sur la syntaxe.
    Une énumération une fois définie s'emploie comme un type, il me semble.
    L'enum ajouté devant chaque emploi de E_Enumeration ligne 5 et 15 de ton 2e exemple me semble de trop.

    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
    enum E_Enumeration{
       E_1=10,
       E_2,
       E_3
    };
     
     
    //template<enum_type> struct stTemplate{};
    template<E_Enumeration> struct stTemplate{}; 
     
    template<> struct stTemplate<E_1>{typedef int Type;};
    template<> struct stTemplate<E_2>{typedef float Type;};
    template<> struct stTemplate<E_3>{typedef char Type;};
     
     
    class A
    {
    public:
     
     
    template<E_Enumeration P_E>
       typename stTemplate<P_E>::Type Valeur()
       {
          return stTemplate<P_E>::Type();
       }
    };
    int main()
    {
       A a;
      a.Valeur<E_1>();
      a.Valeur<E_2>();
      a.Valeur<E_3>();
    }

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Jan Rendek Voir le message
    J'ai comme un doute sur la syntaxe.
    Une énumération une fois définie s'emploie comme un type, il me semble.
    L'enum ajouté devant chaque emploi de E_Enumeration ligne 5 et 15 de ton 2e exemple me semble de trop.

    Effectivement, en enlevant l'enum, ça compile sous visual et gcc:
    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
     
    enum E_Enumeration{
       E_1,
       E_2,
       E_3
    };
    template<E_Enumeration> struct stTemplate{};
     
    template<> struct stTemplate<E_1>{typedef int Type;};
    template<> struct stTemplate<E_2>{typedef float Type;};
    template<> struct stTemplate<E_3>{typedef char Type;};
     
    class A
    {
    public:
     
       template<E_Enumeration P_E>
       typename stTemplate<P_E>::Type Valeur()
       {
          return typename stTemplate<P_E>::Type();
       }
    };
    int main()
    {
       A a;
       a.Valeur<E_1>();
       a.Valeur<E_2>();
       a.Valeur<E_3>();
       return 0;
    }
    En fait, mon erreur est liée à un vieux reste de C où la répétition du enum est obligatoire (modulo typedef).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Arf, quitte à pinailler. Tu n'as aucune spécialisation partielle dans ton exemple ^^

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Jan Rendek Voir le message
    Arf, quitte à pinailler. Tu n'as aucune spécialisation partielle dans ton exemple ^^
    Pinaille, pinaille, ça m'évitera de dire des bêtises: j'ai modifié le titre.

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

Discussions similaires

  1. Requete parametrée avec CristalReport de VB6?
    Par bonsam dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/12/2005, 09h22
  2. Utilisation de template word avec ADO en VBA
    Par 24 faubourg dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 08/12/2005, 19h41
  3. lecture de fichier en parametre avec fstream
    Par tcharles dans le forum SL & STL
    Réponses: 8
    Dernier message: 07/12/2005, 15h33
  4. [STRUTS]Envoi de parametre avec un lien hmtl:link
    Par hinanui dans le forum Struts 1
    Réponses: 33
    Dernier message: 26/07/2005, 16h59
  5. Réponses: 2
    Dernier message: 21/07/2005, 14h20

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