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 :

probleme spécialisation template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut probleme spécialisation template
    Bonjour a tous,
    Etant encore a la decouverte du monde merveilleux des templates j'ai rencontré une erreur en essayant de spécialisé une fonction membre de ma classe template. Voila le code :
    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
     
    template<typename T>
    class Vector2D
    {
    public:
    ....
    //ma fonction à spécialiser :
    template<typename T2> static T2 norm(const Vector2D<T> & myVector2D); //fonction statique template permettant de calculer la norme et de retourner le type T2.
    };
     
    //declaration de la fonction :
    template<typename T>
    template<typename T2>
    T2 Vector2D<T>::norm(const Vector2D<T> & myVector2D)
    {
    	...//aucun probleme avec la declaration de cette fonction
    }
     
    //specialisation souhaité :s
    template<typename T>
    template<>
    int Vector2D<T>::norm(const Vector2D<T> & myVector2D)
    {
    	...//erreur de compilation la fonction ne correspond a aucun modele???
    }
    Voila le probleme je n'ai pas trouvé de solution pour spécialiser cette fonction (excepté remplacer le retour du type T2 par un argument supplémentaire!!) est-ce un probleme de syntaxe ou simplement c'est impossible?
    merci d'avance
    Bonne journée

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    La signature d'une fonction ne dépend que du nom et des arguments(leurs types) de cette fonction.
    Le type de retour n'est pas pris en compte.
    Autrement dit, tu dois par exemple rajouter un argument bidon qui serait du type de la valeur de retour.
    (pourquoi ne pas retourner un réel dans tous les cas ? Un entier est un réel, donc pas de soucis)

  3. #3
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    pourquoi ne pas retourner un réel dans tous les cas ? Un entier est un réel, donc pas de soucis
    Oui je suis d'accord avec toi mais si je retourne un float je risque une troncation dans le cas ou je travaillerai avec des doubles(par exemple), et si je retourne un double je perds de la "place" pour rien lorsque je travaille avec float, int...
    Ces détails sont peut etre dérisoires mais j'aime faire les choses bien
    Il n'existe donc pas d'autre solution que de rajouter un parametre supplémentaire?

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Dans le sens où tu t'attends sans doute à ce que le retour de ta fonction soit de type T (et non de type T2), pourquoi ne pas faire un truc du genre de
    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
     
    template <class T>
    class Vector2D
    {
        public:
            typedef typename T __type;
            typedef std::vector<__type> vector;
            Type Norme(const vector& tab)
            {
                 /*comportement par défaut*/
            }
    }
     
    template <>
    double Vector2D<double>::Norme(const std::vector<double>& tab)
    {
       /* compoirtement spécialisé pour les doubles */
    }
     
    template <>
    float Vector2D<float>::Norme(const std::vector<float>& tab)
    {
       /* compoirtement spécialisé pour les floats */
    }
    /* autres spécialisations */
    (je *crois* que cela devrait fonctionner comme cela )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Oui ca dervrait fonctionner le probleme c'est que je ne m'attend pas a ce que le retour de ma fonction soit de type T!
    Par exemple si je travaille sur des vecteur entiers et je souhaite connaitre la norme, (excepté quelques cas bien rare) il me faut retourner un float.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Mais, dans ce cas, pourquoi ne pas effectivement d'office travailler avec des réels pour le retour quelque chose qui deviendrait
    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
    template <class T>
    class Vector2D
    {
        public:
            typedef typename T __type;
            typedef std::vector<__type> vector;
            double /* ou float */ Norme(const vector& tab)
            {
                 double ret= /* calcule de la norme avec un transtypage de tous les __type en float */
                 return ret;
            }
    }
     
    template <>
    double Vector2D<double>::Norme(const std::vector<double>& tab)
    {
       /* compoirtement spécialisé pour les doubles */
    }
     
    template <>
    double Vector2D<float>::Norme(const std::vector<float>& tab)
    {
       /* comportement spécialisé pour les floats */
    }
    /* autres spécialisations */
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Comme je l'ai marqué plus haut :
    Oui je suis d'accord avec toi mais si je retourne un float je risque une troncation dans le cas ou je travaillerai avec des doubles(par exemple), et si je retourne un double je perds de la "place" pour rien lorsque je travaille avec float, int...
    Ces détails sont peut etre dérisoires mais j'aime faire les choses bien
    C'est sans doute la meilleure solution mais j'aimerais une fonction plus 'générique' (si possible bien entendu )

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

Discussions similaires

  1. probleme de template
    Par tarang dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 23/07/2007, 08h17
  2. Map et probleme de template
    Par sleigh dans le forum Langage
    Réponses: 2
    Dernier message: 21/05/2007, 11h04
  3. Map et probleme de template
    Par sleigh dans le forum C++
    Réponses: 2
    Dernier message: 21/05/2007, 11h04
  4. Probleme de template
    Par alexorcet dans le forum Langage
    Réponses: 9
    Dernier message: 30/11/2006, 21h40
  5. [phpBB] Template phpBB et/ou phpLib
    Par corwin dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 14/02/2006, 15h45

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