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 :

specialisation explicite de patron de fonction avec des parametres de patron non-typé


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Par défaut specialisation explicite de patron de fonction avec des parametres de patron non-typé
    Bonjour,

    voici ma définition de patron générique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     template <class Type, int size>
            int count( Type ( &array )[ size ], Type value )
     {
            int count_value = 0;
            for( int i = 0; i < size; ++i )
    	      if( array[ i ] == value )
    	          ++ count_value;
     
            return count_value;
     }
    Ce patron compile bien.

    Je souhaiterais réaliser aussi une spécialisation explicite de ce patron pour le
    paramètre de patron Type : const char * .

    Voici ce que j'écris dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     typedef const char *PCC;
     template<> int count< PCC , int size >( PCC ( &array )[  size ], PCC value )
     {
           int count_value = 0;
           for( int i = 0; i < size; ++i )
    	      if( strcmp( array[ i ], value ) == 0 )
    		   ++ count_value;
     
           return count_value;
     }
    Malheureusement quand je compile, j'ai deux erreurs pour le patron
    spécialisé.
    -> syntax error : missing ',' before identifier 'size'
    -> 'size' : undeclared identifier

    Cela concerne la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     template<> int count< PCC , int size >( PCC ( &array )[  size ], PCC value )
    Je n'arrive donc pas à écrire convenablement une spécialisation explicite de
    patron de fonction contenant des paramètres de patron non-typé :
    ici 'int size' .

    Je n'ai pas trouvé de réponse sur internet . Quelqu'un sait-il comment faire ?

    Merci d'avance.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Tu te trompe légèrement sur le code à écrire pour une spécialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <int size>
    int count<PCC,size>(PCC ( &array )[ size ], PCC value )
    {
    ...
    }
    size reste un paramètre template non défini dans cette spécialisation.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Par défaut
    Finalement j'ai réussi à compiler en écrivant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<int size> int count( PCC ( &array )[ size ], PCC value )

    Mais alors pourquoi ? mystère...

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par clengrand Voir le message
    Finalement j'ai réussi à compiler en écrivant ceci :

    ########
    template<int size> int count( PCC ( &array )[ size ], PCC value )
    ########


    Mais alors pourquoi ? mystère...
    Parce que tu as surchargé la fonction.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Par défaut
    En fait là tu es en train de me dire que ça a compilé parce que finalement j'ai fait une surcharge de patron de fonction au lieu de faire une spécialisation explicite de mon patron générique , comme je voulais au départ ?

    C'est bien ça?

  6. #6
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonsoir,
    C'est bien ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class Type, int size>
    int count( Type ( &array )[ size ], Type value );
     
    template<int size>
    int count( PCC ( &array )[ size ], PCC value );
    Ces deux fonctions ont le même nom, possèdent deux arguments de types identiques (enfin modulo la généricité), et ont le même type de retour.
    Donc jusque là, elles sont identiques ; où plus exactement, la seconde est une spécialisation de la première.

    La différence se situe au niveau des paramètres template : la première fonction en a deux, alors que la seconde n'en a qu'un.
    On peut donc faire la différence entre les deux, et ainsi la seconde est une surcharge de la première, et pas une spécialisation.

    Pour autant, le comportement sera le même.
    Si l'on peut unifier les paramètres aux deux fonctions, c'est la seconde qui sera choisie, parce que plus spécifique (moins générique) que la première.

    Pour spécialiser correctement une fonction, il faut l'indiquer explicitement lors de sa définition.
    Comme l'a dit Emmanuel Deloget :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <int size>
    int count<PCC,size>(PCC ( &array )[ size ], PCC value )
    {
    ...
    }
    En fait, les paramètres entre chevrons après le nom de la fonction sont implicite pour la version la plus générique d'un patron.

  7. #7
    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 : 34
    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
    Sauf que la spécialisation partielle de fonction ca n'existe pas, donc la solution est bien la surcharge.

  8. #8
    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
    Citation Envoyé par Flob90 Voir le message
    Sauf que la spécialisation partielle de fonction ca n'existe pas, donc la solution est bien la surcharge.
    C'en est où, cette histoire, avec C++11, d'ailleurs ?

  9. #9
    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 : 34
    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
    Ca n'a pas changé à ma connaisance.

  10. #10
    Futur Membre du Club
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Par défaut
    Merci beaucoup pour vos aides respectives.

    Grâce à vous j'ai compris.
    Dans ma situation la seule solution est de faire une surcharge de patron dans le cas de l'utilisation de paramètres de patron non-typés, car actuellement la spécialisation partielle de patrons de fonctions n'est donc possible ?

    A bientôt!

  11. #11
    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
    Exact.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 02/02/2006, 18h13
  2. [Débutant]Fonction avec des flags
    Par @r$£~%[ dans le forum C++
    Réponses: 10
    Dernier message: 22/08/2005, 10h19
  3. Réponses: 6
    Dernier message: 24/02/2005, 09h44
  4. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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