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 :

Surcharge de fonction template


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut Surcharge de fonction template
    Bien le bonjour,

    J'ai un code qui ressemble à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<typename S, typename T>
    bool foo(S const & s, T & t);
     
    template<typename S, typename T>
    void foo(my_class<S> & ts, T & t);
     
    template<typename S>
    void foo(my_class<S> & ts, int & i);
     
    template<typename S>
    void foo(my_class<S> & ts, S & s);
    Je me demandais à quel genre de surprise je pourrais m'attendre avec toutes ces surcharges. A priori le compilo accepte.
    Merci pour vos commentaires.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 31
    Points
    31
    Par défaut
    En particulier, les questions que ton code me font me poser:
    -Quelle fonction est appelée si S est un int

    Il me semble me souvenir de la règle selon laquelle la fonction la plus spécifique sera appelée, donc la troisième dans ton cas, mais je n'ai pas le temps de vérifier par l'exemple.

  3. #3
    Membre habitué Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    Quelques remarques sans faire de tests:

    Il me semble que ce qui peut provoquer des surprises c'est le premier argument de la fonction: le template général prend un S const& (référence constante), les spécialisations partielles prennent un my_class<S>& (référence non constante).
    • Je penses que si tu passes une référence constante a un my_class<S>, le compilateur sélectionnera le template général (alors que peut-être que tu t’attends à ce qu'une spécialisation partielle soit sélectionnée).
    • Je ne sais pas ce qui se passe si tu passe un objet temporaire de type my_class<S>:
      1. Le compilateur sélection le template général, et signale une erreur car tu prends une référence non constante sur un temporaire
      2. Le compilateur sélection une spécialisation partielle (pas de problème)

      Je penses qu'une spécialisation partielle devrait être sélectionnée, mais je n’en suis pas sûr (pas essayé).

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Merci pour vos éponses

    Je pense qu'il n'y a pas de spécialization partielle pour les fonctions template, on parle simplement de surcharge. C'est juste de la terminologie mais je crois qu'il faut le rappeler

    Les essais effectués semblent fonctionner comme je le souhaite dans les cas simples que j'ai codé. Mais je risque de me trouver confronté à des situations complexes et ambigües. Je vais renommer la première fonction qui est un peu hors contexte.
    Reste les trois autres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<typename S, typename T>
    void foo(my_class<S> & ts, T & t);
     
    template<typename S>
    void foo(my_class<S> & ts, int & i);
     
    template<typename S>
    void foo(my_class<S> & ts, S & s);
    La première code un cas général qui ne devrait pas être appelé si un cas spécifique existe. Ça fonctionne (pas avec MSVC6) pour peu qu'il n'y ait pas de conversion implicite de type.

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

Discussions similaires

  1. Surchargé une fonction template avec template
    Par SKone dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2014, 20h00
  2. Surcharge particulière de fonctions templates ?
    Par rulianf dans le forum C++
    Réponses: 6
    Dernier message: 04/02/2009, 14h07
  3. surcharge fonction template
    Par Montag dans le forum Langage
    Réponses: 6
    Dernier message: 21/08/2008, 18h48
  4. Fonctions template+friend sous VC7
    Par patapetz dans le forum MFC
    Réponses: 12
    Dernier message: 24/09/2004, 11h16
  5. Surcharge de fonction d'un edit dynamique
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/10/2003, 11h56

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