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

C++ Discussion :

Templates et Operator()


Sujet :

C++

  1. #1
    Alp
    Alp est déconnecté
    Expert éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut Templates et Operator()
    Bonjour à tous,
    Ben voilà j'essayais d'implémenter un petit foncteur de multiplication, en version template.
    Ca donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class mult 
    {
          public:
          template<typename T> T& operator() (T& t1,T& t2)
          {
                            return t1*t2;
          }
    };
    ensutie dans main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
        mult m;
        cout << m(5,9) << endl;
        cout << m(1.50,40.00) << endl;
        cin.get();
    }
    Et j'obtiens ces erreurs :
    In function `int main()':
    no match for call to `(mult) (int, int)'
    no match for call to `(mult) (double, int)'
    Quelques explications sur ces erreurs ne seraient pas de trop
    Merci de votre attention et de votre temps.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu passes tes arguments sous forme de T&, et non T const &, donc à l'appel de la fonction, tu ne peux pas lui passer une valeur, juste une variable modifiable. C'est pour le cas int, int

    Pour le second cas, si tu veux en plus gérer deux types dfférents, fait deux paramètres template : template<class T1, class T2> ?? operator() (T& t1,T& t2)

    Quel est le type de la valeur de retour dans ce cas ? Soit tu forces l'utilisateur à le spécifier, soit tu utilises une classe de traits.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Alp
    Alp est déconnecté
    Expert éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Merci pour ces explications.
    Comment faire une class de traits? Quel rôle jouerait-elle? Elle détecterait le type à retourner ?

    Edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class mult 
    {
          public:
          template<typename T> T& operator() (T const& t1,T const& t2)
          {
                            return t1*t2;
          }
    };
    me retourne les memes erreurs avec les mêmes appels
    Quand à la multiplication de double et int, c'était une erreur de ma part, j'ai corrigé en mettant 40.0.
    Je verrai plus tard pour des multiplications entre différents types.

  4. #4
    Membre actif Avatar de amaury pouly
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 157
    Points : 224
    Points
    224
    Par défaut
    je ne vois pas en quoi mette const T& résoidrait le problème:
    const T&
    veut dire: valeur passée par référence non modifiable
    or on ne passe pas la référence d'un nombre
    il faut mettre:
    T
    et pas
    const T&

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    En effet :
    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
     
    class mult 
    {
          public:
          template<typename T> T operator() (T t1,T t2)
          {
                            return t1*t2;
          }
    };
     
    int main()
    {
        mult m;
        cout << m(5,9) << endl;
        cout << m(1.50,40.00) << endl;
        cin.get();
    }
    Cela marche.
    Mais faire une copie de chaque objet ... pour des int ca va, mais si je définis mes propres trucs ... Il y aurait pas une astuce que j'aurais manqué? :o

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par amaury pouly
    je ne vois pas en quoi mette const T& résoidrait le problème:
    const T&
    veut dire: valeur passée par référence non modifiable
    or on ne passe pas la référence d'un nombre
    il faut mettre:
    T
    et pas
    const T&
    Ca dépend ce que l'on compte passer comme paramètres. S'il ne s'agit que de types primitifs ou très légers on peut en effet se contenter d'un passage par valeur, sinon il faut prévoir le passage par référence constante.
    Pour ça aussi les traits peuvent bien aider (voir boost::type_traits si je me souviens bien).

    http://c.developpez.com/faq/cpp/?pag...sage_parametre

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu retournais un temporaire via référence...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Alp
    Alp est déconnecté
    Expert éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Ah oui en effet :/ j'risquais pas d'aller bien loin.
    Merci en tout cas.
    Bonne progr'

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

Discussions similaires

  1. template et operator[] ?
    Par rv2931 dans le forum Langage
    Réponses: 5
    Dernier message: 30/11/2012, 16h35
  2. operator() avec les templates
    Par kranagard dans le forum Langage
    Réponses: 6
    Dernier message: 09/02/2011, 15h45
  3. template et operator <<
    Par isoman dans le forum Langage
    Réponses: 5
    Dernier message: 11/03/2008, 20h47
  4. [Débutant]Foncteur et operator() template
    Par Sub dans le forum Langage
    Réponses: 14
    Dernier message: 27/03/2007, 13h51
  5. template et operator +
    Par Fry dans le forum Langage
    Réponses: 15
    Dernier message: 26/06/2006, 20h31

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